8

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

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

MySQL 和 MongoDB 使用前瞻性搜索的索引耗时 0.01 秒,使用全字符串搜索大约需要 6 秒。

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

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

--

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

4

2 回答 2

5

在 MySQL 的情况下,您可以创建全文索引。简而言之,全文索引通过索引每个单词来使部分文本快速匹配。要创建索引,您将编写:

alter table YourTable add fulltext index(article_title);

之后,您可以使用以下命令进行搜索:

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

似乎MongoDB 也有文本索引。我想在任何一种情况下都可以对索引进行微调,因此您必须测试哪种情况更适合您的情况。

于 2013-08-10T22:29:52.407 回答
2

当使用通常实现为BTREE的常规索引时,索引从左到右工作。因此,类似的查询something%将起作用,因为可以使用索引的左侧。与查询类似%something%something%这样的索引不能使用。

全文索引的不同之处在于它索引不常见的单词。常用词(停用词),the例如,被排除在外。MySQL 全文索引也会遗漏 3 个字符或更小的单词。

对于小型案例,内置全文索引可以正常工作。不过,内置的全文索引通常只能带您到此为止,因此在某些时候您可能需要使用专用的解决方案,例如Elastic SearchSpynx

于 2013-08-10T22:56:19.227 回答