在SphinxQL中的LIKE条件

时间:2017-04-29 11:38:54

标签: search-engine sphinx

亲爱的程序员和IT专家,我需要你的帮助。我刚刚开始研究Sphinx是什么。我甚至制作了自己的"谷歌建议",它修复了频繁和常见的人类搜索输入错误。问题是,它试图一直修复错误并中断实际输入。 唔,我希望搜索引擎首先尝试通过子字符串在搜索字段中找到一致,而不是找不到相符,而不是使用我的逻辑来修复错误。如果简单地说,我想要sphinx,首先,执行这个SQL等效命令

SELECT * FROM suggest WHERE keyword LIKE('%$keyword%')
如果没有找到,继续错误修复。 主要问题是....是否有可能告诉spinx按子串搜索?

1 个答案:

答案 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 Collat​​ions要考虑,它们与charset_table不完全相同。

(坦白说,虽然这是正确的。我想知道,如果有点OTT。如果你只想要搜索一个文本语料库,你可以正常索引它。然后运行查询CALL KEYWORDS(),以获得想法如果查询是索引中的有效单词(即只是告诉你在索引中出现多少次给定的单词)。然后可以运行你的算法来修复错误)

作为附注,狮身人面像确实有一个内置的建议系统 http://sphinxsearch.com/blog/2016/10/03/2-3-2-feature-built-in-suggests/