亲爱的程序员和IT专家,我需要你的帮助。我刚刚开始研究Sphinx是什么。我甚至制作了自己的"谷歌建议",它修复了频繁和常见的人类搜索输入错误。问题是,它试图一直修复错误并中断实际输入。 唔,我希望搜索引擎首先尝试通过子字符串在搜索字段中找到一致,而不是找不到相符,而不是使用我的逻辑来修复错误。如果简单地说,我想要sphinx,首先,执行这个SQL等效命令
SELECT * FROM suggest WHERE keyword LIKE('%$keyword%')
如果没有找到,继续错误修复。
主要问题是....是否有可能告诉spinx按子串搜索?
答案 0 :(得分:1)
Sphinx大多可以这样做,但需要了解它的工作原理。 Sphinx对单个单词进行索引,并按关键字进行匹配。它使用大的反向索引来快速进行查询(而不是运行子字符串匹配)
因此可以MATCH('one two')
作为查询,它会匹配包含' ...一两个...'的文档,但顺序并不重要,也可以出现其他单词,所以也要匹配......两个三个......'这与mysql LIKE(它的纯子串匹配)不会发生
可以使用短语运算符执行
MATCH('"one two"')
此外,Sphinx默认匹配整个单词。所以MATCH('one two')
只会匹配这两件作品。它不符合文件说" ...一个twotwentyone ...'而LIKE并不限制整个单词。
因此可以使用通配符来允许部分匹配。
在索引上启用它MATCH('"*one two*"')
---还需要使用min_infix_len
config!
更重要的是,sphinx没有对标点符号等进行索引(默认为charset_table
),所以文档说“......一个! (两个?)......'仍然会匹配MATCH('"one two"')
。 SQL就像不会忽略它。
您可以更改sphinx以索引更多标点符号(通过
charset_table
)以更接近子字符串匹配。
所以SELECT * FROM index WHERE MATCH('"*$keyword*"')
可能是最接近原始的sphinx查询(即子字符串匹配)。只要你意识到差异。还有MySQL Collations要考虑,它们与charset_table不完全相同。
(坦白说,虽然这是正确的。我想知道,如果有点OTT。如果你只想要搜索一个文本语料库,你可以正常索引它。然后运行查询CALL KEYWORDS()
,以获得想法如果查询是索引中的有效单词(即只是告诉你在索引中出现多少次给定的单词)。然后可以运行你的算法来修复错误)
作为附注,狮身人面像确实有一个内置的建议系统 http://sphinxsearch.com/blog/2016/10/03/2-3-2-feature-built-in-suggests/