我正在尝试编写一个全文搜索应用程序,每5分钟索引近10000个传入文件。现在在任何人建议Lucene,Solr,Sphinx,ElasticSearch等之前,我不允许使用其中任何一个。所以我基本上试着阅读构建索引。特别是我被限制使用MySQL(或任何其他RDBMS)来存储索引(而不是文件)。
现在从我对Lucene的了解很少,其核心是一个倒排索引。我试图通过创建一个单词数据库及其包含它们的相应文件来复制它。(同样我不能使用Lucene使用的文档)
我正在运行一个cron作业,如果上传了新文件并将其放入队列,则每5分钟检查一次。关于队列,运行Java代码,该代码创建索引并将其存储在mysql表中。当我们处理一些文件时,所有FCFS都可以。但是,每5分钟就有10000个文件加载,索引将花费大量时间。因此,每次推送新文件时产生线程是否最佳?这将导致我的服务器上运行的数千个线程已经执行其他任务。什么是处理这项任务的最佳方法?
我的另一个问题是: 根据我的阅读,我理解Lucene使用跳过列表来存储包含单词的文档列表。像这样的东西: http://4.bp.blogspot.com/-aAvEQEILnEc/USeg8wgdBqI/AAAAAAAAA-s/1D9sNkwVwkk/s1600/p1.png
然而,由于MySQL的使用,我不能使用跳过列表,而是必须非规范化并面临大量冗余。有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
您必须将文件的文本加载到MySQL表中才能完成这项工作,然后创建一个FULLTEXT索引。
如果你要做的是创建一个方案来搜索文本并返回文件的名称,你可以使用这些列。
id (autoincrement)
filepath (path name for the file)
serialno (when whole file is too long for one filetext column, it can be split)
filetext text from the file.
请注意,列中可以使用FULLTEXT索引编制索引的字符数有限制。如果将filetext
列的长度限制为700个字符,那么您应该没问题。这意味着当您加载表时,您必须将文件文本在单词边界上拆分为此表中的多行。
有一个停用词列表:未编入索引的词。 http://dev.mysql.com/doc/refman/5.5/en/fulltext-stopwords.html
使用FULLTEXT搜索应该可以很好地为您工作。如你所知,如果你想要高性能的文本搜索功能,Lucene提供了许多FULLTEXT没有的东西。