Solr支持多个查询解析器,为搜索应用程序设计者提供了很大的灵活性,可以控制如何解析查询。
本节介绍如何指定要使用的查询分析器。它还描述了solr中包含的主查询解析器所支持的语法和特性,并描述了一些可能对特定情况有用的其他解析器。所有Solr解析器都有一些常见的查询参数;这些参数在公共查询参数一节中进行了讨论。
The Standard Query ParserThe DisMax Query ParserThe Extended DisMax Query ParserOther Parsers常用查询参数defTypedefType参数选择solr用来处理请求中的主查询参数(q)的查询分析器。例如:例如:defType=dismax如果未指定defType参数,则默认情况下使用标准查询分析器。(例如,defType=lucene)sortsort参数按升序(asc)或降序(desc)排列搜索结果。参数可以与数字或字母内容一起使用。可以用全部小写字母或全部大写字母输入方向(即接受asc和ASC)Solr可以根据以下条件对查询响应进行排序:1、Document scores2、Function results3、任何原始字段(数字、字符串、布尔值、日期等)的值,其中docvalues=“true”(或multivalue=“false”和indexed=“true”,在这种情况下,索引术语将用于在运行时动态构建docvalue样的结构)。4、默认情况下,SortableTextField隐式使用docValues=“true”来允许对原始输入字符串进行排序,而不管用于搜索的分析器是什么。5、使用分析器(如关键字标记器)的单值文本字段,每个文档只生成一个术语。textfield不支持docvalues=“true”,但类似docvalue的结构将在运行时即时构建。如果希望能够对要标记其内容以便于搜索的字段进行排序,请在架构中使用copyfield指令来克隆该字段。然后搜索字段并对其克隆进行排序。每个文档中的最小值用于升序(asc)排序,而每个文档中的最大值用于降序(desc)此默认行为相当于使用2个参数field()函数显式排序:sort=field(name,min)asc和sort=field(name,max)desc下表说明了SOLR如何响应排序参数的各种设置。 如果省略sort参数,则执行排序,就像参数设置为score desc一样。 score desc 从最高分数到最低分数按降序排序。 price asc 按价格字段的升序排序 div(popularity,price) desc 按函数欢迎程度除以价格结果的降序排序 inStock desc, price asc 按instock字段的内容按降序排序,然后当多个文档的instock字段值相同时,这些结果按price字段的内容按升序排序。 categories asc, price asc 按(多值)类别字段的最低值升序排序,然后当多个文档具有相同的最低类别值时,这些结果按价格字段的内容升序排序。 关于排序参数的参数:1、排序顺序必须包括字段名(或分数为伪字段),后跟空格(在URL字符串中以+或 转义),后跟排序方向(asc或desc)。2、使用以下语法,可以用逗号分隔多个排序顺序:sort=<field name><direction>,<field name><direction>],…3、当提供多个排序条件时,只有在第一个条目导致平局时,才会使用第二个条目。如果有第三个条目,则仅当第一个条目和第二个条目绑定时才使用。此模式将继续执行更多条目。start指定后,start参数指定查询结果集中的偏移量,并指示solr开始显示来自该偏移量的结果。
默认值为0。换句话说,默认情况下,solr返回的结果没有偏移,从结果本身开始。将start参数设置为其他数字(如3),会导致solr跳过前面的记录,并从偏移量标识的文档开始。
您可以这样使用start参数进行分页。例如,如果rows参数设置为10,则可以通过将start设置为0,然后重新发出相同的查询,并将start设置为10,然后再次发出查询,并将start设置为20来显示连续三页的结果。
rows可以使用rows参数对查询结果进行分页。参数指定SOLR一次应返回到客户机的完整结果集中的最大文档数。
默认值为10。也就是说,默认情况下,solr一次返回10个文档以响应查询。
fq (Filter Query)fq参数定义了一个查询,该查询可用于限制可返回的文档,而不影响分数。它对于加速复杂查询非常有用,因为使用fq指定的查询是独立于主查询缓存的。当以后的查询使用相同的过滤器时,会发生缓存命中,过滤器结果会从缓存中快速返回。
使用fq参数时,请记住以下几点:
1)可以在查询中多次指定fq参数。只有当文档位于由参数的每个实例生成的文档集在交集中时,文档才会包含在结果中。
在下面的示例中,只有popularity大于10且section为0的文档才匹配。
fq=popularity:[10 TO *]&fq=section:0
2)过滤查询可能涉及复杂的布尔查询。上面的例子也可以写成一个fq,有两个强制条款,比如:
fq=+popularity:[10 TO *] +section:0
每个筛选查询中的文档集都是独立缓存的。因此,关于前面的例子:如果这些子句经常出现在一起,使用一个包含两个强制子句的fq;如果它们相对独立,则使用两个单独的fq参数。(要了解调整缓存大小并确保过滤器缓存实际存在http://lucene.apache.org/solr/guide/7_7/the-well-configured-solr-instance.html#the-well-configured-solr-instance)还可以在fq中使用filter(condition)语法单独缓存子句,以及实现缓存的筛选器查询的联合。与所有参数一样:URL中的特殊字符需要正确转义并编码为十六进制值。在线工具可帮助您进行URL编码。https://meyerweb.com/eric/tools/dencoder/
fl (Field List)fl参数将查询响应中包含的信息限制为指定的字段列表。字段必须存储为stored="true" or docValues="true"`.`
字段列表可以指定为空格分隔或逗号分隔的字段名称列表。字符串“score”可用于指示应作为字段返回特定查询的每个文档的分数。通配符*选择文档中stored="true" or docValues="true" and useDocValuesAsStored="true"的所有字段(启用docvalues时默认)。您还可以向字段列表请求添加伪字段、函数和转换器。
您还可以向字段列表请求添加伪字段、函数和转换器。
此表显示了如何使用fl的一些基本示例:
Field List
Result
id name price
Return only the id, name, and price fields.
id,name,price
Return only the id, name, and price fields.
id name, price
Return only the id, name, and price fields.
id score
Return the id field and the score.
*
Return all the stored fields in each document, as well as any docValuesfields that have useDocValuesAsStored="true". This is the default value of the fl parameter.
* score
Return all the fields in each document, along with each field’s score.
*,dv_field_name
Return all the stored fields in each document, and any docValues fields that have useDocValuesAsStored="true" and the docValues from dv_field_name even if it has useDocValuesAsStored="false"
fl中的函数
可以为结果中的每个文档增加计算函数,并作为伪字段返回:
函数参考:
http://lucene.apache.org/solr/guide/7_7/function-queries.html#function-queries
fl=id,title,product(price,popularity)
fl中的转换器
文档转换器可用于修改查询结果中每个文档返回的信息:
fl=id,title,[explain]
文档结果转换器参考:
http://lucene.apache.org/solr/guide/7_7/transforming-result-documents.html#transforming-result-documents
字段别名
您可以将字段、函数或转换器的响应中使用的键更改,方法是在其前面加上一个`“displayname:`”。例如:
fl=id,sales_price:price,secret_sauce:prod(price,popularity),why_score:[explain style=nl]
{"response": {
"numFound": 2,
"start": 0,
"docs": [{
"id": "6H500F0",
"secret_sauce": 2100.0,
"sales_price": 350.0,
"why_score": {
"match": true,
"value": 1.052226,
"description": "weight(features:cache in 2) [DefaultSimilarity], result of:",
"details": [{
"..."
}]}}]}}
debug调试参数可以多次指定,并支持以下参数:
debug=query:仅返回有关查询的调试信息。
debug=timing:返回有关查询处理时间的调试信息。
debug=results:返回有关分数结果的调试信息(也称为“explain”)。
默认情况下,分数解释将作为大字符串值返回,使用换行符和制表符缩进实现结构和可读性,但可以指定附加的debug.explain.structured=true参数,以将此信息作为wt请求的响应格式的固有嵌套数据结构返回。
debug=all返回有关请求的所有可用调试信息。(或者用法:debug=true)。
为了与旧版本的solr向后兼容,可以将debugquery=true指定为指示debug=all的替代方法。
默认行为不包括调试信息。
explainOtherexplainOther参数指定Lucene查询以标识一组文档。如果包含此参数并将其设置为非空值,则查询将返回相对于主查询(由q参数指定)的调试信息以及与Lucene查询匹配的每个文档的“解释信息”。例如:
q=supervillians&debugQuery=on&explainOther=id:juggernaut
上面的查询允许您检查顶部匹配文档的得分解释信息,将其与文档匹配ID:Juggernaut的解释信息进行比较,并确定排名为什么不像您期望的那样。
此参数的默认值为空,不会返回额外的“解释信息”。
timeAllowed此参数指定搜索完成所允许的时间量(毫秒)。如果此时间在搜索完成之前过期,则将返回任何部分结果,但对于整个结果集,numfound、facet counts和result stats等值可能不准确。
此值仅在以下时间检查:
查询扩展,以及文档收集由于此检查是定期执行的,因此在中止请求之前可以处理请求的实际时间将略大于或等于所允许的时间值。如果请求在其他阶段、自定义组件等消耗更多时间,则不希望此参数中止请求。
segmentTerminateEarly早期分段终止,
此参数可以设置为true或false。如果设置为true,并且此集合的MergePolicyFactory是使用与为此查询指定的排序参数兼容的排序选项的SortingMergePolicyFactory,则Solr将尝试使用EarlyTerminingSortingCollector。如果使用提前终止,则在ResponseHeader中将包含SegmentTerminatedEarly头段。
与使用timeallowed参数类似,当发生早期段终止时,numfound、facet counts和result stats等值对于整个结果集可能不准确。
此参数的默认值为false。
omitHeader此参数可以设置为true或false。
如果设置为true,则此参数将从返回的结果中排除头部信息。头包含有关请求的信息,例如完成请求所需的时间。此参数的默认值为假。
wtwt参数选择solr用来格式化查询响应的响应编写器。有关响应编写器的详细说明,
参考:
http://lucene.apache.org/solr/guide/7_7/response-writers.html#response-writers
如果您没有在查询中定义wt参数,JSON将作为响应的格式返回。
cacheSolr默认缓存所有查询的结果并筛选(filter)查询。要禁用结果缓存,请设置cache=false参数。
You can also use the cost option to control the order in which non-cached filter queries are evaluated. This allows you to order less expensive non-cached filters before expensive non-cached filters.
你可以使用cost选项控制不缓存的过滤查询被评估。这允许你在昂贵的非缓存过滤器之前使用更便宜的非缓存过滤器。
对于非常高成本的过滤器,如果cache=false和cost>=100并且查询实现了postfilter接口,那么将从该查询请求一个收集器,并在文档与主查询和所有其他过滤器查询匹配后用于过滤文档。可以有多个post过滤器;它们也按成本排序。
对于大多数查询,默认行为cost=0 - ,但某些类型的查询(如{!frange})默认为成本=100,因为它们在用作PostFilter时更高效。
例如:
这是3个常规过滤器的示例,其中每个过滤器生成的所有匹配文档都是预先计算并独立缓存的:
q=some keywords
fq=quantity_in_stock:[5 TO *]
fq={!frange l=10 u=100}mul(popularity,price)
fq={!frange cost=200 l=0}pow(mul(sum(1, query('tag:smartphone')), div(1,avg_rating)), 2.3)
frange :http://lucene.apache.org/solr/guide/7_7/other-parsers.html#function-range-query-parser
mul:乘法 pow 平方
这些都是运行不带缓存的相同筛选器。对库存(quantity_in_stock)字段中数量的简单范围查询将与主查询并行运行,就像传统的Lucene过滤器一样,而两个frange过滤器将只针对每个已经匹配主查询的文档进行检查,并且库存范围查询中的数量将首先进行检查(因为o如果它是隐式成本=100),并且只有当它匹配时,才会检查最终的非常复杂的过滤器(其较高的成本=200)。
logParamsList
默认情况下,solr会记录请求的所有参数。设置此参数以限制记录请求的哪些参数。这可能有助于控制日志记录到那些被认为对您的组织很重要的参数。
例如,您可以这样定义:
logParamsList=q,fq
并且只有‘q’和‘fq’参数将被记录。
如果不应记录任何参数,则可以将logParamsList作为空发送(即logParamsList=)。
此参数不仅适用于查询请求,而且适用于对Solr的任何类型的请求。
echoParams
echoParams参数控制在响应头中包含哪些有关请求参数的信息。
echoParams参数接受以下值:
explicit:这是默认值。只有包含在实际请求中的参数,加上_ parameter(64位数字时间戳)将添加到响应头的params部分。
all:包含用于查询的所有请求参数。这将包括在solrconfig.xml中找到的请求处理程序定义中定义的所有内容,以及请求中包含的参数以及_ parameter。如果在请求处理程序定义和请求中包含了一个参数,那么它将多次出现在响应头中。
none:完全删除响应头的params部分。响应中没有有关请求参数的信息。
下面是一个JSON响应的示例,其中未包含echo Params参数,因此显式的默认值是活动的。创建此响应的请求URL包括三个参数-q、wt和缩进:
{
"responseHeader": {
"status": 0,
"QTime": 0,
"params": {
"q": "solr",
"indent": "true",
"wt": "json",
"_": "1458227751857"
}
},
"response": {
"numFound": 0,
"start": 0,
"docs": []
}
}
如果发送类似的请求,将echoparams=all添加到前一个示例中使用的三个参数中,就会发生这种情况:
{
"responseHeader": {
"status": 0,
"QTime": 0,
"params": {
"q": "solr",
"df": "text",
"preferLocalShards": "false",
"indent": "true",
"echoParams": "all",
"rows": "10",
"wt": "json",
"_": "1458228887287"
}
},
"response": {
"numFound": 0,
"start": 0,
"docs": []
}
}
http://lucene.apache.org/solr/guide/7_7/common-query-parameters.html