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

Posted

技术标签:

【中文标题】有没有一种快速的方法可以在任何数据库中进行 \'%phrase%\' 搜索?【英文标题】:Is there a fast way to do a '%phrase%' search in any DB?有没有一种快速的方法可以在任何数据库中进行 '%phrase%' 搜索? 【发布时间】:2013-08-12 13:54:04 【问题描述】:

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

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

MySQL 和 MongoDB 都需要 0.01 秒,使用前向搜索的索引,大约 6 秒的全字符串搜索。

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

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

--

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

【问题讨论】:

提供有关 MySQL(版本、引擎、结构、您使用的查询)和 MongoDB(cfg、版本、客户端)的更多信息 MySQL 5.1.7,Mongod 2.4.5。 MySQL 表是 MyISAM,因为它是专门读取的,我只是在寻找性能。 另见***.com/questions/17973889/… 应该可以用于标题,但不适用于正文内容 【参考方案1】:

对于 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。我想在任何一种情况下都可以对索引进行微调,因此您必须测试哪种情况更适合您的情况。

【讨论】:

很高兴知道...我认为全文索引可以为您提供更好的结果,但不知道它们可以加速部分文本匹配。我现在就这样做并跟进结果。谢谢! 有限制,据我所知,全文索引将索引 words:而模式 %bar% 将匹配 foobarbarfoofoobarfoo,在全文索引中搜索单词bar 将不需要找到包含该子字符串 的单词。还是我对该主题的了解已经过时了? @SylvainLeroux 我相信你是对的。尽管如此,对于 OP 所描述的目的,这种限制似乎是可以接受的。 另请阅读***.com/questions/609935/… 全文索引有所帮助,因为我现在得到了亚秒级的响应时间,但是正如 Sylvain 所提到的,结果并不是字符串中的字符串搜索。结果的质量并不差,但“总统”不会返回“总统”。这使得自动完成功能非常糟糕。还有其他想法吗?【参考方案2】:

使用常规索引(通常以BTREE 实现)时,索引从左到右工作。所以像something% 这样的查询会起作用,因为可以使用索引的左侧。对于%something%something% 之类的查询,不能使用这样的索引。

A Full-Text index 的不同之处在于它索引不常见的单词。常用词 (stop-words),例如 the,被排除在外。 MySQL full-text 索引也会忽略 3 个字符或更小的单词。

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

【讨论】:

以上是关于有没有一种快速的方法可以在任何数据库中进行 '%phrase%' 搜索?的主要内容,如果未能解决你的问题,请参考以下文章

在 UIScrollView 中调整内容 UIView 的大小,有没有一种好方法可以做到这一点而无需进行任何计算?

有没有一种快速简便的方法来转储 MacOS X 钥匙串的内容?

有没有一种快速的方法可以同时训练多个模型?

在 awk 中对哈希/数组进行排序

有没有一种简单的方法可以从 JavaScript 或任何其他编程语言中的数组中进行随机选择?

有没有一种方法可以对Hex包进行端到端的认证?