有没有一种快速的方法可以在任何数据库中进行 '%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%
将匹配 foobar
、barfoo
和foobarfoo
,在全文索引中搜索单词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 钥匙串的内容?