Sphinx检索语法与匹配模式
匹配模式
SPH_MATCH_ALL,匹配所有查询词(缺省模式)
SPH_MATCH_ANY,匹配任意查询词
SPH_MATCH_PHRASE,短语匹配
SPH_MATCH_BOOLEAN,布尔表达式匹配
SPH_MATCH_EXTENDED,查询匹配一个Sphinx内部查询语言表达式
布尔查询语法(Boolean query syntax)
布尔查询允许使用下面特殊操作符:
AND:hello & world
OR:hello | world
NOT:hello -world或hello !world
Grouping:(hello world)
举一个使用这些操作符的例子:
( cat -dog ) | ( cat -mouse)
AND是一个隐式操作符,“hello world”就相当于“hello & world”。
OR的优先级高于AND,所以“looking for cat | dog | mouse”的意思是“looking for (cat | dog | mouse)”而不是“(looking for cat) | dog | mouse”
象“-dog”这种隐式地包含了所有查询记录,是不会被执行的。这主要是考虑到技术上与性能上的原因,从技术上来说,sphinx不能总保持所有文章的ID列表,性能上来说,当结果集巨大(10-100M),执行这样的查询将费耗较长时间。
扩展查询语法(Extended query syntax)
扩展查询允许合我下面特殊操作符:
操作符OR:hello | world
操作符NOT:hello -world或hello !world
字段搜索操作符:@title hello @body world
短语(phrase)搜索符:”hello world”
临近(proximity)搜索符:”hello world”~10
举例:
“hello world” @title “example program”~5 @body python -(php|perl)
AND是一个隐式操作符,”hello world”表示hello与world都要出现在匹配的记录中。
OR的优先级高于AND,所以“looking for cat | dog | mouse”的意思是“looking for (cat | dog | mouse)”而不是“(looking for cat) | dog | mouse”
临近距离在串中标明了,主要是用来调整单词数量,应用在引号中的所有查询字串。”cat dog mouse”~5表示包括这三个单词在内,总共不能多于8个单词的间隔。比如”CAT aaa bbb ccc DOG eee fff MOUSE”就不能匹配这个查询,因为单词间隔刚好是8个。
象aaa | ( bbb ccc | ( ddd eee ) )这样的括号嵌套查询目前还不支持,但以后会修正的。
否定(如NOT)只允许出现在顶层,不允许出现在括号内(如groups)。这点是不会改变的。因为支持否定嵌套查询会让短语排序(phrase ranking)的实现变得过于复杂。
权重(匹配度,Weight)
采用什么权重功能取决于搜索模式(Search mode)
在权重函数中,有两个主要部分:(短语排名)phrase rank和statistical rank(统计排名)
短语排名是基于搜索词在文档和查询短语中的最长公共子序列(LCS)的长度。所以如果在记录中有切确的短语匹配,记录的短语排名将有可能是最高的,等于查询单词的总个数。
统计排名是建立在经典的BM25算法基础之上,它只考虑词频。词在全部文档集合中以低的频度出现或高频度出现在匹配的文档中,那么它获得的权重就越大,最终的BM25权重是一个介于0到1之间的小数。
好的子短语匹配得到好的排名,最好的匹配放到最顶端。Sphinx作者的经验是:基于排名的密切短语比其它任何单独的统计方式表现出较好的搜索质量。
在SPH_MATCH_BOOLEAN 模式中,不需要计算权重,每条匹配记录的权重都是1
在SPH_MATCH_ALL和SPH_MATCH_PHRASE模式中,最终的权重是短语排名权重的总和
在SPH_MATCH_ANY模式中,本质上是一样的,但它也增加了每个字段的匹配单词数量,在这之前,短语排名权重乘以一个足够大的值以保证在任意一个字段的较高短语排名可以匹配排名较高者,即使它的字段权重比较低。
在SPH_MATCH_EXTENDED模式中,最终的权重是短语权重和BM25权重的总和,再乘以1000取整。