4.3.扩展查询语法

优质
小牛编辑
133浏览
2023-12-01

在扩展查询模式中可以使用如下特殊操作符:

  •  或(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