4.3.扩展查询语法
在扩展查询模式中可以使用如下特殊操作符:
- 或(OR)操作符:
hello | world
- 非(NOT)操作符:
hello -world hello !world
- 字段(field)搜索符:
@title hello @body world
- 字段限位修饰符(版本Coreseek 3/Sphinx 0.9.9-rc1中引入):
@body[50] hello
- 多字段搜索符:
@(title,body) hello world
- 全字段搜索符:
@* hello
- 词组搜索符:
"hello world"
- 近似搜索符:
"hello world"~10
- 阀值匹配符:
"the world is a wonderful place"/3
- 严格有序搜索符(即“在前”搜索符):
aaa << bbb << ccc
- 严格形式修饰符(版本Coreseek 3/Sphinx 0.9.9-rc1中引入):
raining =cats and =dogs
- 字段开始和字段结束修饰符 (版本Coreseek 3.1/Sphinx 0.9.9-rc2中引入):
^hello world$
以下是上述某些操作符的示例:
Example6.扩展查询示例
"hello world" @title "example program"~5 @body python -(php|perl) @* code
例子中查询的完整解释如下:
- • 在文档的任意字段中找相邻的“hello”和“world”
- • 不仅如此,符合上述条件的文档的title字段中还必须包含 “example”和“program”这两个词,并且他们之间至多有10个(不包括10个)其他的词(例如“example PHP program”可以匹配,但“example script to introduce outside data into the correct context for your program”就不行,因为中间有10个或以上的词。
- • 同时,body字段必须含有词“python”,但既没有“php”也没有“perl”
- 最后, 任一字段中包含”code“.
与(AND)操作为默认操作,因此“hello world”意思是“hello”和“world”必须同时存在文档才能匹配。
或(OR)操作符的优先级要高于与操作符,因此"looking for cat | dog | mouse" 意思是"looking for ( cat | dog | mouse )" 而不是"(looking for cat) | dog | mouse";
字段限制(field limit)符(field limit)将其后指定的搜索限制在某个特定的字段中。通常,如果给出的字段名实际并不存在,你会得到一条错误信息。但可以通过在查询的最开始处加上@@relaxed选项来放宽限制。
@@relaxed @nosuchfield my query
当搜索多个具有不同schema的索引时这可能有用
版本Coreseek 3/Sphinx 0.9.9-rc1又引入了字段限位(field position limit)符。它把搜索限制在指定字段(一个或多个)的前N个位置。例如“@body[50] hello”不会匹配那些body字段包含“hello”,但它出现在第51个位置或者更靠后的文档。
近似距离以词为单位,随词数变化而变化,并应用于引号中的全部词。举个例子,"cat dog mouse"~5 这个查询的意思是必须有一个少于8个词的词串,它要包含全部的三个词,也就是说"CAT aaa bbb ccc DOG eee fff MOUSE" 这个文档不会匹配这个查询,因为这个词串正好是8个词。
阀值匹配符引入了一种模糊匹配。它允许至少含有某个阈值数量个匹配词的文档通过。上述例子("the world is a wonderful place"/3)会匹配含有指定的六个词中的至少三个的那些文档。上面例子中的一个查询”the world is a wonderful place”/3匹配的文档至少含有指定的6个词中的3个。
严格有序搜索符(即“在前”搜索符)是在版本0.9.9-rc2中引入的,它的几个参数在被匹配的文档中必须严格按查询中出现的顺序出现。例如,“black << cat”这个查询(不包括引号)可以匹配“black and white cat”,但不能匹配“the cat was black”。顺序操作符的优先级最低,它既可以应用在最简单的关键词上,也可以用在更复杂的表达式上,比如下面也是个正确的查询:
(bag of words) << "exact phrase" << red|green|blue
版本0.9.9-rc1引入了“严格形式”关键字修饰符,它保证关键词在匹配文档中严格以指定的形式出现,而默认行为只要求词根相同。例如,查询“runs”既可以匹配含有“runs”的文档,也可以匹配含有“running”的文档,因为这二者的词根都是“run”——而如果查询是“=runs”,那就只有前者能匹配。严格形式修饰符要求index_exact_words选项处于启用状态。这是个影响关键字的修饰符,可以与其他一些操作符混合使用,例如词组搜索符、近似搜索符和阈值搜索符等。
关键字修饰符“字段开始”和“字段结束”是在版本Coreseek 3.1/Sphinx 0.9.9-rc2中引入的,它们确保只在一个全文字段的最开始或最结束位置匹配关键字。例如,查询“^hello world$”(包括引号,也就是说这个查询是词组搜索符和字段起止修饰符的组合)匹配的文档必然包括某个严格只有“hello world”这个词组的字段。
自版本Coreseek 3/Sphinx 0.9.9-rc1始,可以嵌套任意层数的括号和“非”操作,但这类查询要想能够计算出结果,就必须保证不能隐含地涉及所有文档。
// 正确查询 aaa -(bbb -(ccc ddd)) // 不能计算的查询 -aaa aaa | -bbb