1.7.4 Query Syntax and Parsing

时间:2023-02-06 05:09:03

1. 查询语法和解析

  这部分主要说明了如何指定被使用的查询解析器.同样描述了主查询解析器的支持的语法和功能.同时还描述了在特定环境下使用的其他查询解析器.这里有一些普通查询解析器都能使用的参数,将会在Common Query Parameters中介绍.

  这里讨论的解析器如下:

  • The Standard Query Parser
  • The DisMax Query Parser
  • The Extended DisMax Query Parser
  • Other Parsers

  查询解析插件是所有http://lucene.apache.org/solr/api/solr-core/org/apache/solr/search/QParserPlugin.html的子类.如果想要自定义这个类,你需要继承这个类.

  更多细节参考.https://wiki.apache.org/solr/SolrQuerySyntax.

1.1 Common Query Parameters

  下面是solr常用的查询参数,支持 Standard, DisMax, eDisMax 等请求处理器.

参数 描述
defType 选择处理查询的查询解析器.
sort 排序
start 指定显示solr结果的偏移量(默认为0)
rows 搜索结果一次显示行数(默认为10)
fq 对搜索结果的过滤查询
fl With version 3.6, Solr limited the query's responses to a listed set of fields. With version 4.0, this parameter returns only the score
debug

在响应中请求额外的调试信息,指出debug=timing参数返回计时信息,指定debug=results返回每个文档的"解释"信息

指定debug=query parameter 返回所有的debug调试信息

explainOther  允许客户端指定一个Lucene query 来识别一组文档集合.如果非空,解释每个匹配查询的文档,相对于主查询(q参数指定),将会一起返回其余部分的调试信息.
timeAllowed  定义查询处理允许的时间.如果超出这个时间限制,可能返回部分信息.
omitHeader  从返回结果中排除头,如果设置为true,返回中将包含头部信息.比如请求花费的时间.默认为false.
wt  指出Response Writer响应的格式
cache=false  默认,solr缓存所有查询结果和过滤结果.设置cache=false将会放弃查询缓存结果.
logParamsList  默认情况下,solr记录所有参数.从版本4.7,设置这个参数来限制哪些参数被记录.有效输入参数进行记录,以逗号分隔(如 logParamsList=param1,param2).一个空的列表将会不记录参数.如果想要记录所有的参数,不需要定义额外的参数.

  

  1.1.1 The  defType Parameter

  选择处理查询的查询解析器,如

  defType=dismax

  solr1.3以后的版本,默认设置为dismax.

  1.1.2 sort

  sort排序搜索结果,asc或者desc.大小写均可.

  solr排序查询响应结果可以通过文档评分或者任何索引字段的单值(也就是在schema.xml中字段包含multiValued="false"和indexed="true").提供:

  • 字段是不分词的.(也就是说字段没有分析器-analyzer,内容已经被分解成tokens)
  • 字段可以使用这样的分析器-KeywordTokenizer,只生成一个短语(term).

  如果你想要对已分词的字段进行排序以方便搜索,直接使用schema.xml中的<copyField>复制字段.然后对这个字段进行搜索,对它的复制字段进行排序.

  关于排序参数:

  • 一个排序顺序必须包含字段名(或者score作为一个伪字段),接着是空格(转义为+或者%20 在URL字符串中),接着是一个排序的方向(asc或者desc).
  • 多个排列顺序通过逗号分割,使用这样的语法: sort=<field name>+<direction>,<fieldname>+<direction>],...

  1.1.3 The start Parameter

  start参数指定了查询结果的偏移量设置,说明solr从偏移量位置开始显示结果数据.默认为0.设置start为3,solr将会跳过前面的记录,识别偏移量位置的文档开始.

你可以使用start参数来分页,比方说rows=10,通过设置start=0,你将会成功返回3页结果.然后重新补发查询,设置start=10,然后重新补发查询,设置start=20.

  1.1.4 The rows Parameter

  使用rows参数从查询结果中分页.默认为10.

  1.1.5 The fq(Filter Query) Parameter

  fq参数用于限制查询结果的父集,不会影响评分.对于加速复合查询是非常有效的.因为fq指定的查询缓存是独立于主查询.后面有一个相同的过滤查询的话,就会命中这个缓存.

过滤结果快速从缓存中返回.

  在使用fq参数时,注意以下事项:

  • fq参数可以在查询中指定多次.将返回多个参数过滤的交集.
    fq=popularity:[ TO *]&fq=section:
  • 过滤查询可以调用复杂的Boolean查询.上面的例子可以被写成一个单独的fq:
    fq=+popularity:[ TO *]+section:
  • 对于每个过滤查询的文档集都是独立缓存的.
  • 如同所有的参数,在URL的特殊字符需要正确转义和编码为十六进制值.可以帮助使用的在线编码工具是: http://meyerweb.com/eric/tools/dencoder/

  1.1.6 The fl(Field List) Parameter

  fl参数限制了查询响应中指定的字段列表.这些字段需要存储在索引中.

  多个字段之间可以通过空格或者逗号来分隔,*表示选择所有文档中存储的字段.也可以对这个字段列表添加伪字段,函数,转换器等.

字段列表 结果
id name price 查询结果中返回id, name, and price字段
id,name,price 查询结果中返回id, name, and price字段
id name,price 查询结果中返回id, name, and price字段
id score 查询结果返回id score字段
* 查询结果返回所有存储字段
* score 查询结果返回所有查询字段,包含每个字段的评分

  1.1.6.1 Document Transformers

  Transformers修改查询响应返回的字段.Transformers必须首先在solrconfig.xml中配置.然后这个transformers可以添加到查询请求中,响应结果将会根据这个transformers修改:

  例如:如果你开启了一个叫"elevated"转换器,你应该标记所有的已经被使用QueryElevationComponent提升的文档.一种方式就是在solrconfig.xml中键入:

<transformer name="elevated"  class="org.apache.solr.response.transform.EditorialMarkerFactory" />

 你可以在定义字段返回的时候,请求部分包含[elevated].

fl=id,title,[elevated]

  其他常用的例子就是添加"explain"信息,添加常量"value"到文档,或者添加"shard"已经被索引的文档, . 关于Transformer更多的信息参考:http://wiki.apache.org/solr/DocTransformers

  1.1.6.2 Field Name Aliases

  你可以通过指定fieldName:displayName来改变返回字段的名称,这将会在response中返回字段名称为displayName:

fl=id,price:sale_price

  1.1.7 The debug Parameter

  在Solr4中,请求调试信息和结果进行了简化,从一组相关参数到一个单独的格式化的参数.现在参数简单的设置为debug,具有一下参数值:

  • debug=true: 只返回查询的调试信息.
  • debug=query:只返回查询的调试信息.
  • debug=timing:返回查询处理花费的时间
  • debug=results:返回关于结果的调试信息(又名"explain")

  默认行为是不包含调试信息的.

  1.1.8 The explainOther Parameter

  explainOther参数指定了一个Lucene查询,以识别一组文档.如果这个参数包含,并且是非空值,相对于主查询,查询将会返回debugging信息,和每个文档匹配Lucene查询的"explain info"信息.例子:

q=supervillians&debugQuery=on&explainOther=id:juggernaut

  上面的查询允许你检查关于最高匹配文档的评分解释信息.比较它的文档匹配id:juggernaut的解释信息,分析排序为什么没有按照你所想的排列.

  此参数的默认值是空白,这不会引起额外的“解释”给被退回。

  1.1.9 The  timeAllowed Parameter

   定义查询处理允许的时间.毫秒级,如果超出这个时间限制,可能返回部分信息

  1.1.10 The  omitHeader Parameter

  这个参数可以被设置为true或者false.

  如果设置为true,返回的结果集中将忽略头部信息.头部包含了请求的信息,如请求花费的时间.默认值为false.

  1.1.11 The  wt Parameter

  查询返回结果的格式.具体细节参考Response Writers.

  1.1.12The cache=false Parameter

  solr缓存所有的查询结果,默认过滤所有查询.设置cache=false参数,关闭缓存查询.

  您还可以使用cost选项控制在非缓存的过滤器查询的计算顺序,这允许你订购更低成本的非缓存过滤器.

  对给高cost的过滤器,如果设置cache=false和cost>17,查询实现PostFilter接口,查询请求的收集器(Collector)将在它们匹配主查询和其他过滤查询之后用作过滤文档.

有可能有多个psot filters,它们同样通过cost 排序.

// 正常功能范围查询当作一个过滤器(filter), 所有匹配的文档生成了front和缓存
fq={!frange l=10 u=100}mul(popularity,price)
// 和主查询如典型的lucene过滤查询 并行运行的功能范围查询
fq={!frange l=10 u=100 cache=false}mul(popularity,price)
// function range query checked after each document that already matches the query and all other filters. Good for really expensive function queries.
fq={!frange l=10 u=100 cache=false cost=100}mul(popularity,price)

  1.1.13 The  logParamsList Parameter

  默认情况下,solr记录所有请求参数.从solr4.7,设置这个参数限制哪些参数将被日志记录.

   如:logParamsList=q,fq
  只有参数q和fq 被记录.

1.2 The Standard Query Parser

  在solr1.3以前,Standard Request Handler叫做standard query parser 作为默认的查询解析器,solr1.3版本以后, Standard Request Handler调用DisMax作为默认查询解析器.如果你喜欢,你可以通过调用the standard query parser来配置solr.

  standard query parser的优势在于使用户指定非常精确的查询,缺点就是相比较DisMax 查询解析,没有语法容错的功能.DisMax查询解析器尽可能的抛出最少的错误.

1.2.1 Standard Query Parser Parameters

  除了Common Query Parameters ,Faceting Parameters ,Highlighting Parameters, MoreLikeThis Parameter.标准查询解析还支持下面参数:

参数 描述
q 使用标准的查询语法定义一个查询,这个参数是强制的.
q.op 指定查询表达式的默认操作,覆盖schema.xml中指定的默认操作.可能的操作 "AND" 或者 "OR".
df 指定默认字段,覆盖schema.xml中默认字段的定义.

1.2.2 The Standard Query Parser's Response

  标准查询解析响应

  默认情况下,标准查询解析响应包含<result>模块.

  下面的URL,提交了一个查询,请求一个XML响应输出:

http://yourhost.tld:9999/solr/select?q=id:SP2514N&version=2.1&indent=1

  结果输出:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<responseHeader>
<status>0</status>
<QTime>1</QTime>
</responseHeader>
<result numFound="1" start="0">
<doc>
<arr name="cat">
<str>electronics</str>
<str>hard drive</str>
</arr>
<arr name="features">
<str>7200RPM, 8MB cache, IDE Ultra ATA-133</str>
<str>NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB)
motor
</str>
</arr>
<str name="id">SP2514N</str>
<bool name="inStock">true</bool>
<str name="manu">Samsung Electronics Co. Ltd.</str>
<str name="name">Samsung SpinPoint P120 SP2514N - hard drive - 250 GB -
ATA-133
</str>
<int name="popularity">6</int>
<float name="price">92.0</float>
<str name="sku">SP2514N</str>
</doc>
</result>
</response>

  这是一个限制字段的例子:

http://yourhost.tld:9999/solr/select?q=id:SP2514N&version=2.1&indent=1&fl=id+name

  结果:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<responseHeader>
<status>0</status>
<QTime>2</QTime>
</responseHeader>
<result numFound="1" start="0">
<doc>
<str name="id">SP2514N</str>
<str name="name">Samsung SpinPoint P120 SP2514N - hard drive - 250 GB -ATA-133
</str>
</doc>
</result>
</response>

1.2.3 Specifying Terms for the Standard Query Parser

  指定标准查询解析器的词(Terms)

  一个查询字符串到标准查询解析器会被分解成词(terms)和运算符.这里有两种类型的词(terms):单一的词和短语

  • 一个单独的term就是一个单独的单词 如"test"或者"hello" .
  • 一个短语就是一组单词.如"hello dolly".

  多个terms可以通过布尔操作符连接在一起.

  1.2.3.1 Terms修改

  solr支持多种term修改方式,包括通配符,这些修饰包括通配符,用于使搜索“模糊”或更普遍的字符,并依此类推。下面的章节详细描述了这些修饰。

  1.2.3.2 Wildcard Searches-通配符搜索

  solr的标准查询解析器在一个term中支持单个或者多个字符通配符搜索.通配符可以用在单个term中,但是不能用在搜索短语中.

  ? : 匹配单个字符.字符串te?t可以匹配test和text.

  * : 匹配零个或者多个字符序列.tes*可以匹配test,testing,tester.

  1.2.3.3 Fuzzy Searches-模糊搜索

  solr的标准查询解析器支持基于Damerau-Levenshtein距离或者编辑距离算法的模糊搜索.如模糊搜索"roam,":

    roam~

  这个搜索将会匹配 roams, foam, 和 foams,同样也会匹配"roam"它自己.

  一个可选的距离参数指定了可以允许的最大距离数.在0和2之间.默认为2.例如roam~1 ,这里将会匹配roams & foam,但不会匹配foams,因为它的编辑距离是2.

  1.2.3.4 Proximity Searches-邻近搜索

  邻近搜索查找彼此在一定距离的terms.

  为了表示邻近搜索,添加字符~和在搜索短语的末尾添加一个数字值.如搜索"apache"和 "jakarta",两个词之间的距离在10个单词范围以内:

    "jakarta apache"~10

  1.2.3.5 Range Searches-范围搜索

  例子:

  对mod_date字段,值为20020101和20030101的范围查询:

  mod_date:[20020101 TO 20030101]

  同样可以对非日期字段使用范围查询:

  title:{Aida TO Carmen}

  1.2.3.6 Boosting a Term with ^ - 对Term加权

  solr或者Lucene可以使用脱字符^对term加权.值越大,term的相关度就越高.这样可以通过加权term来控制文档的相关度.如果你想要搜索"jakarta apache",使"jakarta"更相关,可以对jakarta加权,如: 

jakarta^4 apache

  同样也可以对短语加权

"jakarta apache"^4 "Apache Lucene"

  默认的权值是1.0.虽然权重因子必须是正值,但是它是可以小于1的(如 0.2).

1.2.4 Specifying Fields in a Query to the Standard Query Parser

  在一个query中为标准查询解析器指定字段.

  solr索引中的数据是由字段组成的,这些字段在schema.xml中被定义.solr可以通过指定一个字段来搜索.schema.xml中指定了一个默认搜索的字段,如果在query中没有指定字段,那么solr查询将使用默认字段查询.

1.2.5 Boolean Operators Supported by the Standard Query Parser

  标准查询支持布尔操作.

布尔操作 可替换符号 描述
AND && 任何一个tern都匹配
NOT ! 不匹配term
OR || 其中一个term匹配
  + 要求后边的term必须出现
  - 禁止后面的term出现(也就是匹配不包含这个term的字段或者文档),-操作符和|操作符很相似,

  注意:Lucene支持 AND, "+", OR, NOT and "-"操作符.

  标准的查询解析器支持以上的所有操作.但是DisMax查询解析器只支持"+"和"-".

  "OR"是默认的连接操作符.在schema.xml文件中可以修改这个默认操作符.

  搜索"jakarta apache"或者 "jakarta,"时,使用的查询:

"jakarta apache" jakarta  或者 "jakarta apache" OR jakarta
  • The Boolean Operator +

    要求+后面的term必须存在

  • The Boolean Operator AND (&&)

    AND操作符号要求两个terms都必须存在.

    "jakarta apache" AND "Apache Lucene"
    "jakarta apache" && "Apache Lucene"
  • The Boolean Operator NOT (!)

    NOT排序包含term的文档

"jakarta apache" NOT "Apache Lucene"
"jakarta apache" ! "Apache Lucene"
  • The Boolean Operator -

    -操作符排除包含在-之后的term的文档.

"jakarta apache" -"Apache Lucene"
  • Escaping Special Characters

  solr查询时给出以下字符的特殊含义:

  + - && || ! ( ) { } [ ] ^ " ~ * ? : /

  为了让solr从字面上解释这些字符,而不是作为一个特殊字符,可以使用一个反斜杠\转义这些特殊字符.如(1+1):2

\(1\+1\)\:2

1.2.6 Grouping Terms to  Form Sub-Queries

  solr/Lucene支持使用括号组合来形成子查询.如果你想要控制布尔逻辑的查询,这是非常有效的.如:

(jakarta OR apache) AND website

  也可以对字符使用括号组合:

title:(+return +"pink panther")

1.2.7 Differences between Lucene  Query Parser  and the Solr Standard Query Parser

   Lucene Query Parser和 Solr Standard Query Parser的不同之处

  solr standard query parser 不同于 Lucene query parser之处在于:

  • *号可以用于范围查询
    • field:[* TO 100]
    • field:[100 TO *]
    • field:[* TO *] 匹配这个字段的所有文档
  • 只有*查询允许的纯负查询(禁止所有查询).
    • -inStock:false
    • -field:[* TO *]  查询所有没有字段field的文档
  • 函数查询语法,需要使用括号来封装函数.
    • _val_:myfield
    • _val_:"recip(rord(myfield),1,2,3)"
  • 支持任何类型的查询解析
    • {  } !geodist d=10 p=20.5,30.2}
  • 范围查询("[a TO z]"),前缀查询a*和通配符查询a*b是常量评分(所有匹配文档评分一样).评分因素TF,IDF,索引权重,"coord"都没有使用.

1.2.8  Specifying Dates and Times

  对于使用TrieDateField类型的字段,可以使用如下查询语法:

  • timestamp:[* TO NOW]
  • createdate:[1976-03-06T23:59:59.999Z TO *]
  • createdate:[1995-12-31T23:59:59.999Z TO 2007-03-06T00:00:00Z]
  • pubdate:[NOW-1YEAR/DAY TO NOW/DAY+1DAY]
  • createdate:[1976-03-06T23:59:59.999Z TO 1976-03-06T23:59:59.999Z+1YEAR]
  • createdate:[1976-03-06T23:59:59.999Z/YEAR TO 1976-03-06T23:59:59.999Z]

1.2.9 Related  Topics

  • Local Parameters in Queries
  • Other Parsers

1.3 The DisMax Query Parser

  DisMax查询解析器设计的目的在于处理用户输入的简单的短语(不需要复杂的语法),通过不同的权重跨字段搜索个别的terms.

  一般情况下,对于solr的标准查询解析,DisMax查询解析更像Google的查询接口.这种相似性使得DisMax查询分析器对于许多消费类应用更加适合.它接受一个简单的语法,它很少会产生错误消息。

  该DisMax查询分析器支持的Lucene的QueryParser语法的一个非常简化的子集.正如在Lucene中,括号可用于分组短语,+/-可以用来表示强制性的和可选查询语句.所有其他Lucene的查询解析器的特殊字符(除AND和OR)被转义,以简化用户体验.

  DisMax查询解析器负责建立一个好的查询,它从用户的输入中使用包含DisMax跨字段和指定权重的Boolean语句查询,它也同样可以让solr的用户管理员提供一个另外的加权查询,加权函数,过滤查询,人为地影响到所有的搜索结果。这些选项都可以在solrconfig.xml中作为handler的默认参数来指定或者在URL中覆盖.

  感兴趣的DisMax名字背后的技术概念? DisMax代表最大分离。这里有一个最大分离或“DisMax”查询的定义:

A query that generates the union of documents produced by its subqueries, and that scores each document with the maximum
score for that document as produced by any subquery, plus a tie breaking increment for any additional matching subqueries.

1.3.1 DisMax Parameters

参数 描述
q 定义原始状态的输入的查询字符串
q.alt 在不使用q参数时,调用标准查询解析器,定义查询输入字符串
qf 查询字段:定义哪些索引中哪些字段执行查询.如果缺少,默认为df.
mm

最小(Minimum)"should"匹配:指定在查询中必须匹配的字段的最小数量.如果'mm'参数没有在查询中指定,或者是没有在solrconfig.xml中定义一个默认的,q.op参数(在query查询中,或在solrconfig.xml中作为默认值,或者schema.xml中的defaultOperator选项)的有效值将用于影响这种行为.如果q.op="AND"那么mm="100%",如果q.op="OR",那么mm="1".

用户如果想要使用mm参数作为默认行为,可以在solrconfig.xml文件中配置.此参数容忍表达式中的杂项空格.如" 3 < -25% 10 < -3\n", " \n-25%\n ", "\n3\n ").

pf 短语字段:提高文档评分,以防查询参数中所有的词(term)以一种相近的情况出现.
ps 短语跳度:指定两个term之间的位置数量,以匹配指定的短语.
qs 查询短语跳度:指定两个term之间的位置数量,以匹配指定的短语.和qf参数一起使用
tie Tie Breaker:在DisMax查询中,使用一个浮点值(应该小于1)作为一个tiebreaker.
bq Boost Query:在考虑匹配时,通过term或者短语应该被加权来增加其重要性.
bf Boost Functions:指定用于加权的函数,

1.3.1.1 q 参数

  q参数构成了搜索查询的精髓.这个参数支持用户原始输入的字符串,没有经过转义."+","-"被作为term的"强制"和"禁止"修饰符.文本被引号括住(如"San Jose")将被当作一个短语.

  注意:q参数并不支持通配字符*

 1.3.1.2 q.alt 参数

  在不使用q参数时,调用标准查询解析器,定义查询输入字符串

 1.3.1.3 qf (Query Field )参数

  qf包含了一个字段的列表,每个字段可以加权以提高字段的重要性.

qf="fieldOne^2.3 fieldTwo fieldThree^0.4"

1.3.1.4 mm(Minimum Should Match) 参数

  在处理查询时,Lucene/Solr识别三种类型的从句:强制类型,禁止类型,可选类型(也可叫做"should"从句).默认情况下,q参数中的所有单词和短语都被当作可选类型来处理.在处理可选类型的参数时,mm参数使设置一个一定的最小数这些从句必须匹配.DisMax查询分析器在指定最小数上具有很大的灵活性.

  下面解释说明了设置mm值的多种方式:

语法 例子 描述
正整数 3 定义必须匹配的最小字句数量.不管总共有多少条子句.
负整数 -2 设置匹配子句可选子句总数的最小数量,再减去这值
百分数 75% 设置最小匹配字句数量到可选子句数量的百分比.百分比的计算是向下舍,然后作为最小数
负百分数 -25% 表示这个总可选子句的百分数的子句会缺失.百分比的计算是向下舍,然后总数减去这个数字.
正整数开始,后边跟着>或<,跟着另外一个值的表达式 3<90% 定义了一个条件表达式,可选子句的数量小于(或等于)这个整数,那么它是必填的,如果大于这个整数,该规范适用.在这个例子中,如果那有1到3个子句都是必须要求的,但是大于4的字句,90%是要求的.
多个条件表达式调用>或者<

2<-25%

9<-3

定义多个条件.在这个例子左边,1或2个子句是必须要求的,3-9个子句,75%的是必须要求的,超过9个句子的话,所有的除了3个不是必须要求的.

  在指定mm值时,注意以下方面:

  • 当用百分比处理,负值可用于获取边缘的情况下不同的行为.75% 和-25%在处理4个子句时意味着相同的意思.但是在处理5个子句时,75%意味着3个子句要求,-25%意味着处理4个子句要求.
  • 如果基于参数计算确定不需要的可选子句,在搜索时,关于布尔查询的一般规则任然使用.(也就是,布尔查询包含非要求的字句必须仍旧匹配一个可选的字句)
  • 不管计算达到了一个什么样的数值,solr从来不会使用一个大于可选子句总数的数值,或者是一个小于1的数值.

  默认mm值为100%,表示必须完全匹配.

1.3.1.5 pf(Phrase Fields) 参数

  一旦使用fq和pf参数用来识别文档,如果q参数中的所有term以比较靠近的方式在文档中出现的话,pf参数可以用来加权这个文档得分.格式和qf参数相同.

1.3.1.6 ps(Phrase Slop) 参数

  短语跳度:指定两个term之间的位置数量,以匹配指定的短语.

1.3.1.7 qs (Query Phrase Slop)参数

  查询短语跳度:指定两个term之间的位置数量,以匹配指定的短语.和qf参数一起使用

1.3.1.8 tie 参数

  在DisMax查询中,使用一个浮点值(应该小于1)作为一个tiebreaker.

  当用户输入一个term用于测试多个字段搜索,可能超过一个字段匹配这个term.那么基于这个单词在字段中的普通(common)程度生成一个评分(score),这个tie参数通过对比最低评分的字段和最高评分字段,控制最终评分对查询的影响.

  值"0.0"是一个纯的"分裂的最大的查询":也就是说,只有最高得分子查询有助于最终得分.值"1.0"是一个纯的"分裂的查询总和":也就是说,它不管哪个子查询的评分最大,因为最终的评分将会是所有子查询评分的总和.通常一个较低的值,如0.1,是比较有用的.

1.3.1.9  bq (Boost Query)参数

  bq参数指定了一个输入的原始的查询字符串(表现在Solr的查询语法中),包含在用户的查询中,以影响评分,例如,如果你想要最最近的文档增加一个相关度的调整.

q=cheese bq=date:[NOW/DAY-1YEAR TO NOW/DAY]

  可以指定多个bq参数,如果想要你的查询解析成具有单独权重的字句,可以使用bq参数.

 1.3.1.10 bf(Boost Functions)参数

例子:

recip(rord(myfield),,,)^1.5

如果想要优先显示最近的文档:

recip(rord(creationDate),,,)

1.3.2 Examples of Queries Submitted to the DisMax Query Parser

  使用StandardRequestHandler和默认的搜索字段查询单词"video"的结果:

http://localhost:8983/solr/select/?q=video&fl=name+score

  配置dismax 句柄,跨text, features, name, sku, id, manu, 和 cat等多个字段带有加权设计以匹配更多的结果.特别是:匹配name和cat字段的将得到更高的评分.

http://localhost:8983/solr/select/?defType=dismax&q=video

  这个实例配置了一个字段列表,覆盖默认的字段列表:

http://localhost:8983/solr/select/?defType=dismax&q=video&fl=*,score

  覆盖查询字段,并加权重:

http://localhost:8983/solr/select/?defType=dismax&q=video&qf=features^20.0+text^0.3

  可以对字段匹配一个指定的值的结果加权:

http://localhost:8983/solr/select/?defType=dismax&q=video&bq=cat:electronics^5.0

  另一个实例的句柄(handler)使用了qt "instock",有轻微不同的配置选项,尤其:一个过滤器(猜想)inStock:true.

http://localhost:8983/solr/select/?defType=dismax&q=video&fl=name,score,inStock
http://localhost:8983/solr/select/?defType=dismax&q=video&qt=instock&fl=name,score,inStock
http://localhost:8983/solr/select/?defType=dismax&q=belkin+ipod
http://localhost:8983/solr/select/?defType=dismax&q=belkin+ipod+gibberish
http://localhost:8983/solr/select/?defType=dismax&q=belkin+ipod+apple
http://localhost:8983/solr/select/?defType=dismax&q=belkin+ipod+gibberish&debugQuery=true
http://localhost:8983/solr/select/?defType=dismax&q=video+card&debugQuery=true

1.4 The Extended DisMax Query Parser

  扩展的DisMax(eDismax)查询解析器是DisMax查询解析器的一个提高版本.除了支持DisMax所有的查询解析外,eDisMax 还支持:

  • 支持全Lucene查询解析语法
  • 支持 AND, OR, NOT, -, +的查询
  • 将"and","or" 转换为Lucene的"AND","OR".
  • 关于神奇的字段名称:_val_和_query_.在schema.xml中这个不是一个真实的字段,但是使用它可以做一些特殊的事情,如_val_的函数查询和_query_的嵌套查询.如果一个_val_被一个term或者短语使用,那么这个值将被当作一个函数解析.
  • 在语法错误的地方智能转义特殊字符;字段查询,+/-,短语查询,也仍旧在这个模式中支持.
  • improves proximity boosting by using word shingles; you do not need the query to match all words in the document before proximity
    boosting is applied.
  • 包含高级停用词处理:停用词在查询部分并不是强制必须要求的,但是仍旧在邻近加权部分使用.如果一个查询全部是由停用词组成的,如"to be or not to be",那么所有的词都是必须要求的.
  • 支持纯的否定嵌套查询:+foo (-foo)匹配所有文档
  • 使您可以指定哪些字段最终用户可以查询,并不允许直接派出搜索

1.4.1 Extended DisMax Parameters

  除了所有的DixMax参数外,eDixMax还支持以下参数:

    1.4.1.1 boost参数

    对于所有匹配的文档,一个多值字符串列表解析成查询使用评分乘以主查询的评分.这个参数是BoostQParserPlugin的简写.

    1.4.1.2 lowercaseOperators参数

    表面操作符号"and" 和"or"是否被当作"AND" 和"OR"处理

    1.4.1.3 ps 参数

    建有pf,pf2 ,pf3字段的默认短语查询跳度.

  1.4.1.4 pf2 参数

    一个字段的多值列表.具有可选的权重,基于word shingles对(pairs).

  1.4.1.5  ps2 参数

    建有pf,pf2 ,pf3字段的默认短语查询跳度.solr4以后新增,和ps相似,但是设置默认的跳度因素为2,如果没有指定,使用ps.

  1.4.1.6 pf3 参数

    要给字段的多值列表,具有可选的权重,基于三连的word shingles,和pf相似,except that instead of building a phrase per field  out of all the words in the input, it builds a set of phrases for each field out of each triplet of word shingles.

  1.4.1.7 stopwords 参数

    布尔参数,声明是否在查询分析器中配置StopFilterFactory.如果设置为false,将在查询分析器中忽略StopFilterFactory.

  1.4.1.8 uf 参数

    指定那个schema的字段用户可以使用精确查询,这个参数支持通配符,默认允许所有字段,等价于uf=*.为了只允许title字段,使用uf=title.允许title和所有以_s结尾的字段,使用uf=title,*_s.允许所有字段,除了title,使用uf=*-title.不现实所有字段搜索,使用uf=-*.

1.4.2  Examples of Queries Submitted to the Extended DisMax Query Parser

  对基于文档的popularity,查询term为 "hello" 的结果加权:

http://localhost:8983/solr/select/?defType=edismax&q=hello&pf=text&qf=text&boost=popularity

  搜索iPods或者video:

http://localhost:8983/solr/select/?defType=edismax&q=ipod  OR video

  跨过个字段搜索:

http://localhost:8983/solr/select/?q=video&defType=edismax&qf=features^20.0+text^0.3

  还可以对一个字段匹配一个指定的值加权:

http://localhost:8983/solr/select/?q=video&defType=edismax&qf=features^20.0+text^0.3&bq=cat:electronics^5.0

  使用mm参数,1个,2个单词查询要求所有的可选子句匹配,但是对于3个以上的子句,可以允许丢失一个子句.

http://localhost:8983/solr/select/?q=belkin+ipod&defType=edismax&mm=2
http://localhost:8983/solr/select/?q=belkin+ipod+gibberish&defType=edismax&mm=2
http://localhost:8983/solr/select/?q=belkin+ipod+apple&defType=edismax&mm=2

  在下面的例子中,我们看到per-field覆盖qf参数,使用别名"name"到查询字符串或者是"last_name"和"first_name"字段:

defType=edismax
q=sysadmin name:Mike
qf=title text last_name first_name
f.name.qf=last_name first_name

1.4.3  Using the 'magic fields' _val_ and _query_

  • 如果_val_用于term或者短语查询,它的值将被解析为函数.
  • 这里提供了一个FunctionQuery函数语法.当包含圆括号时,必须用引号封装.
    _val_:myfield
    _val_:"recip(rord(myfield),1,2,3)"
  • solr 查询解析提供嵌套查询支持任何查询解析类型(通过QParserPlugin).
    _query_:"{!dismax qf=myfield}how now brown cow"

1.5 Function Queries

  参考 1.7.4.1 Function Queries

1.6 Local Parameters in Queries

  参考1.7.4.2 Local Parameters in Queries--局部参数

1.7 other Parsers

  参考 1.7.4.3 Parsers