我有一个包含5M行的大型数据集。数据集中的一个字段是'article_title',我想实时搜索我正在我网站上构建的自动完成功能。
我一直在尝试使用MySQL和MongoDB作为潜在的数据库解决方案。当使用索引时,两者都表现良好,例如'some%',但我需要在字符串中匹配标题,如'%something%'。
使用前瞻性搜索,MySQL和MongoDB使用索引花费0.01秒,使用完整字符串搜索花费约6秒。
我意识到需要扫描整个数据库以进行字符串字符串类型搜索,那么这个问题的常见方法是什么?对于这个问题,Solr和Sphinx似乎有些过分,所以我尽量避免使用它们。
如果我有一个装有2 GB RAM和40GB SSD的盒子(这是我目前能买得起的),我能否获得亚秒响应时间?提前谢谢。
-
更新:我尝试了全文索引,虽然结果非常快,但它并不真正满足字符串字符串搜索(“presiden”与“总统”不匹配)。我正在寻找方法来匹配字符串中的字符串和5M行数据集。
答案 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 Search或Spynx。