Sphinx 基本上可以做到这一点,但需要了解它是如何工作的。 Sphinx 索引单个单词,并按关键字匹配。它使用大型倒排索引来快速查询(而不是运行子字符串匹配)
所以可以将MATCH('one two') 做为查询,它会匹配一个包含“...一二...”的文档,但顺序无关紧要,其他词也可以出现,ALSO 也可以match '... 二三一 ...' 这不会发生在 mysql LIKE 中(它是一个纯子字符串匹配)
可以使用短语运算符来做到这一点MATCH('"one two"')
此外,Sphinx 默认匹配整个单词。所以MATCH('one two') 只会匹配这两个作品。它不会匹配一个文档说“... one twotwentyone ...”,而 LIKE 不限于整个单词。
因此可以使用通配符来允许部分匹配。 MATCH('"*one two*"') --- 还需要在索引上使用min_infix_len 配置启用它!
更重要的是,狮身人面像不索引标点符号等(默认为charset_table),所以一个文档说'......一个! (两个?)...' 仍将匹配 MATCH('"one two"')。 SQL like 不会忽略这一点。
您可以更改 sphinx 以索引更多标点符号(通过 charset_table)以更接近子字符串匹配。
所以SELECT * FROM index WHERE MATCH('"*$keyword*"') 可能是最接近原始查询的狮身人面像查询(即子字符串匹配)。只要你意识到差异。还有要考虑的 MySQL 排序规则,它们与 charset_table 不完全相同。
(坦率地说,虽然这是正确的。我想知道是否有点 OTT。如果您只有一个想要搜索的文本语料库,您可以正常索引它。然后通过 CALL KEYWORDS() 运行查询,以了解是否查询是索引中的有效单词(即只是告诉您给定单词在索引中出现的次数)。然后可以运行您的算法来修复错误)
作为旁注,斯芬克斯确实有一个内置的建议系统
http://sphinxsearch.com/blog/2016/10/03/2-3-2-feature-built-in-suggests/