有没有快速的方法在任何数据库中进行'%phrase%'搜索?

时间:2013-08-10 22:23:26

标签: mysql mongodb search optimization autocomplete

我有一个包含5M行的大型数据集。数据集中的一个字段是'article_title',我想实时搜索我正在我网站上构建的自动完成功能。

我一直在尝试使用MySQL和MongoDB作为潜在的数据库解决方案。当使用索引时,两者都表现良好,例如'some%',但我需要在字符串中匹配标题,如'%something%'。

使用前瞻性搜索,MySQL和MongoDB使用索引花费0.01秒,使用完整字符串搜索花费约6秒。

我意识到需要扫描整个数据库以进行字符串字符串类型搜索,那么这个问题的常见方法是什么?对于这个问题,Solr和Sphinx似乎有些过分,所以我尽量避免使用它们。

如果我有一个装有2 GB RAM和40GB SSD的盒子(这是我目前能买得起的),我能否获得亚秒响应时间?提前谢谢。

-

更新:我尝试了全文索引,虽然结果非常快,但它并不真正满足字符串字符串搜索(“presiden”与“总统”不匹配)。我正在寻找方法来匹配字符串中的字符串和5M行数据集。

2 个答案:

答案 0 :(得分:2)

对于MySQL,您可以创建full-text index。简而言之,全文索引通过索引每个单词来快速部分文本匹配。要创建索引,您需要写:

alter table YourTable add fulltext index(article_title);

之后,您可以搜索:

select * from YourTable where match(article_title) against ('something');

似乎是MongoDB also has text indexes。我想在任何一种情况下都可以对索引进行微调,因此您必须测试哪种方法更适合您的情况。

答案 1 :(得分:1)

当使用常规索引(通常实现为BTREE)时,索引从左到右工作。因此,something%之类的查询将起作用,因为可以使用索引的左侧。使用%something%something%等查询时,无法使用此类索引。

A Full-Text index的不同之处在于它会索引不常见的单词。常见字词(stop-words),例如the,不包括在内。 MySQL full-text索引也会遗漏3个字符或更小的字词。

对于小案例,内置的全文索引可以正常工作。内置的全文索引通常只会带你到目前为止,所以在某些时候你可能需要使用专用的解决方案,如Elastic SearchSpynx