我正在尝试编写一个全文搜索应用程序,该应用程序每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的使用,我不能使用跳过列表,而必须进行非规范化并面临很多冗余。有什么办法解决吗?

最佳答案

您必须将文件的文本加载到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不需要的很多东西。

07-28 00:41
查看更多