2011-08-23 34 views
5

我有一个mysql数据库,其中不断添加大量文本。 (每小时10页文字)。文本以明文形式存储在文本字段中。每一行都会联系一个或两个文本。在mysql中搜索大量不断更新的文本

我需要定期在此数据库上进行全文搜索(在文本中搜索关键字并执行复杂的查询)。我只需要搜索新添加的文本。但是,添加文本可以立即搜索(一两分钟内),这一点非常重要。

从我读过的,与MySQL的全文是非常低效的。我知道lucene是一个选项,但我不确定它可以多快地索引新文本。

那么我有什么选择?有没有办法让mysql更高效? lucene是我最好的解决方案吗?什么更合适?

感谢

回答

2

我已经完成索引时间狮身人面像的基准测试& Solr。与Solr相比,Sphinx在索引算法(超快索引时间和小索引大小)方面遥遥领先。

当你说10页的文字,它似乎你甚至不需要实时狮身人面像索引。您可以按照Sphinx中的主要+增量索引方案(您可以在Sphinx文档中找到)。这将是超快和接近实时的。如果您需要更多帮助,请随时询问,很高兴向您解释。

Solr是伟大的,但谈到优化算法狮身人面像岩石!尝试狮身人面像。

在评论中提到您的问题,Solr/Lucene支持增量索引(在他们的术语中称为delta导入),其安静易于配置,但与Sphinx使用的方法相比,它们相当慢。

Main + Delta很快就够了,因为你可以做的就是创建一个临时表存储你的新文本并索引它。根据文档:Sphinx支持“实时”(几乎实时)索引更新,并且可以使用所谓的“主+增量”方案来实现。这个想法是设置两个来源和两个索引,其中一个为数据的“主要”索引,另一个为新文档的“增量”。

举个例子,你有1000万条记录,所以你可以保留它作为主索引,并且所有新文档都被添加到一个新的表中,这个表将作为三角洲。这个新表格可以不时索引(比如说每1小时),并且数据可以在几秒钟内搜索到,因为您有10页文本。现在,在您搜索到新记录后,您可以合并主表+ delta表格的文档,这可以在不干扰搜索的情况下执行。合并文档时,清空新表并在一小时后再次执行整个过程。我希望你有其他问题,请随时提出任何问题。

+0

谢谢你的帮助。从我读的主+三角洲正是我所需要的。但是有一点在文档中不明确;他们说它将把索引时间缩短到30到60秒。就我而言,在几秒钟内(最多一分钟)准备好可以搜索新文本是非常重要的。主+三角洲足够快吗?从我看到的狮身人面像就是这样。 – applechief

+0

非常欢迎。你可以在上面看到我编辑的答案。主+三角洲应该为你工作,因为狮身人面像索引真的很快。但还有一件事:请看上面答案中提到的狮身人面像中的实时索引,我从来没有用过它,但看起来很有希望。将两者都应用于数据后,您可以查看哪些最适合您。 – Yavar

2

你有两个选择:

  • Sphinx Search:可以与你的MySQL数据库直接集成。支持实时索引,有局限性

  • Solr/Lucene:通过JSON或XML从数据库中提供数据。具有丰富的查询功能。目前的版本不是实时的,没有一些边缘构建。您必须重新为您的数据建立索引并将其提交以显示更改。根据你的数据量,你可以每10分钟做一次提交。由于Lucene在编制索引时速度非常快,因此这不会成为问题,直到您拥有100K/1M +文档。每小时10页是相当平凡的。

  • ElasticSearch:Java是基于像Solr/Lucene一样的,但似乎足够真正的“近实时”。其工程开箱即可分布并支持线性扩展。您通过JSON提供数据并通过JSON查询。

这实际上取决于您的需求和能力。狮身人面像可能是最容易入门的。但是它的实时索引限制可能不适合你。

+0

Sphinx和ElasticSearch看起来很有趣。我将研究狮身人面像的实时限制。那么lucene每次都会对整个数据库进行重新索引?它不会对其索引进行增量更新吗?什么关于shinx和elasticsearch? – applechief

+0

1. ElasticSearch也基于Lucene 2. Lucene可以在新出现的文档中添加文档,因此您不必重新编制任何内容,但@Code意味着您需要提供文档并调用相对昂贵的“提交”操作,以便文档出现 - 这仅适用于Solr。 Lucene等ElasticSearch不需要昂贵的“提交”3. ElasticSearch非常容易上手...... – Karussell