查询提升组件
查询提升组件允许您为给定的查询配置顶部结果,而无需考虑正常的 Lucene 评分。
这有时称为“赞助搜索”、“编辑提升”或“最佳选择”。此组件将用户查询文本与配置的顶部结果映射进行匹配。文本可以是任何字符串或非字符串 ID,只要它被索引即可。尽管此组件可与任何 QueryParser 一起使用,但最好与 DisMax 查询解析器或扩展 DisMax (eDisMax) 查询解析器一起使用。
查询提升组件还支持分布式搜索。
本节中使用的所有示例配置和查询都假设您正在运行 Solr 的“techproducts”示例
bin/solr start -e techproducts
配置查询提升组件
您可以在 solrconfig.xml
文件中配置查询提升组件。像 QueryElevationComponent
这样的搜索组件可以添加到任何请求处理程序;为了简洁起见,此处使用专用的请求处理程序。
<searchComponent name="elevator" class="solr.QueryElevationComponent" >
<!-- pick a fieldType to analyze queries -->
<str name="queryFieldType">string</str>
<str name="config-file">elevate.xml</str>
</searchComponent>
<requestHandler name="/elevate" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="echoParams">explicit</str>
</lst>
<arr name="last-components">
<str>elevator</str>
</arr>
</requestHandler>
或者,在查询提升组件配置中,您还可以指定以下内容,以区分编辑结果和“正常”结果
<str name="editorialMarkerFieldName">foo</str>
查询提升搜索组件采用以下参数
queryFieldType
-
必需
默认值:无
指定应使用哪个字段类型来分析传入的文本。例如,使用带有
LowerCaseFilter
的字段类型可能是合适的。另一个示例是,如果您需要取消转义反斜杠转义的查询,则可以定义字段类型以使用
PatternReplaceCharFilter
进行预处理。以下是字段类型的相应示例<fieldType name="unescapelowercase" class="solr.TextField"> <analyzer> <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\\(.)" replacement="$1"/> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
例如,要仅取消转义非字母数字字符,模式可以是
\\([^\p{IsAlphabetic}\p{Digit}])
。 config-file
-
必需
默认值:无
定义提升规则的文件路径。此文件必须存在于 configset 中。与大多数配置不同,如果文件在提交后发生更改,此组件将重新读取其配置。但是,这在 SolrCloud 中不起作用,并且必须有实际的索引更改,提交才能生效,才能将其用作获取更改的一种方法。在所有情况下,您都可以重新加载受影响的核心/集合以使用 configset 中的任何新配置。
forceElevation
-
可选
默认值:
false
默认情况下,此组件尊重请求的
sort
参数:如果请求按日期排序,它将按日期对结果进行排序。如果forceElevation=true
,结果将首先返回提升的文档,然后按日期排序。默认为false
。这也是一个请求参数,它将覆盖配置。 useConfiguredElevatedOrder
-
可选
默认值:
true
当多个文档被提升时,它们的相对顺序应该是配置文件中的顺序,还是应该服从排序标准?这也是一个请求参数,它将覆盖配置。当
forceElevation
为 true 且存在字段排序时,效果最明显。 elevateOnlyDocsMatchingQuery
-
可选
默认值:
false
默认情况下,该组件还会提升不属于搜索结果(与查询匹配)的文档。如果您只想提升属于搜索结果的文档,请将其设置为
true
。
elevate.xml 文件
可以在 config-file
参数中指定的外部 XML 文件中配置提升的查询结果。一个 elevate.xml
文件可能如下所示
<elevate>
<query text="foo bar">
<doc id="1" />
<doc id="2" />
<doc id="3" />
</query>
<query text="ipod">
<doc id="MA147LL/A" /> <!-- put the actual ipod at the top -->
<doc id="IW-02" exclude="true" /> <!-- exclude this cable -->
</query>
<query text="foo bill" match="subset">
<doc id="11" />
</query>
</elevate>
在此示例中,查询 "foo bar" 将首先返回文档 1、2 和 3,然后返回该查询通常出现的任何内容。对于查询 "ipod",它将首先返回 "MA147LL/A",并确保 "IW-02" 不在结果集中。
请注意第三个规则中值为 "subset"
的 match
参数。查询 "bill bar foo" 将触发此规则,因为该规则定义了查询中出现的术语子集(以任何顺序)。此查询将把文档 11 提升到顶部。match
参数接受 "exact"
(默认)或 "subset"
值。子集匹配是可扩展的,可以使用 match="subset"
参数添加许多规则。
如果要提升的文档未在 elevate.xml
文件中定义,则应在查询时使用 elevateIds
参数传递它们。
使用查询提升组件
enableElevation 参数
为了进行调试,查看包含和不包含提升文档的结果可能很有用。要隐藏结果,请使用 enableElevation=false
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&debugQuery=true&enableElevation=true
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&debugQuery=true&enableElevation=false
forceElevation 参数
您可以通过向查询 URL 添加 forceElevation=true
在运行时强制提升
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&debugQuery=true&enableElevation=true&forceElevation=true
exclusive 参数
您可以通过向 URL 添加 exclusive=true
来强制 Solr 仅返回提升文件中指定的结果
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&debugQuery=true&exclusive=true
文档转换器和 markExcludes 参数
可以使用 [elevated]
文档转换器来注释每个文档,其中包含有关是否已提升的信息
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&fl=id,[elevated]
同样,在进行故障排除时,查看所有匹配的文档(包括提升配置通常会排除的文档)可能会有所帮助。这可以通过使用 markExcludes=true
参数,然后使用 [excluded]
转换器来实现
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&markExcludes=true&fl=id,[elevated],[excluded]
elevateIds 和 excludeIds 参数
当提升组件在使用时,可以在请求时覆盖查询的预配置提升列表,以使用这些请求参数中指定的唯一键。
例如,在下面的请求中,文档 3007WFP 和 9885A004 将被提升,而文档 IW-02 将被排除,而不管在 elevate.xml 中为查询 "cable" 配置了哪些提升或排除项。
https://127.0.0.1:8983/solr/techproducts/elevate?q=cable&df=text&excludeIds=IW-02&elevateIds=3007WFP,9885A004
如果在请求时指定了这些参数中的任何一个,则会忽略查询的整个提升配置。
例如,在下面的请求中,文档 IW-02 和 F8V7067-APL-KIT 将被提升,并且不会排除任何文档,而不管在 elevate.xml 中为查询 "ipod" 配置了哪些提升或排除项。
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&elevateIds=IW-02,F8V7067-APL-KIT
带有提升的 fq 参数
默认情况下,查询提升会遵循标准过滤器查询(fq
)参数。也就是说,如果查询包含 fq
参数,则所有结果都将在此过滤器内,即使 elevate.xml
将其他文档添加到结果集中也是如此。
如果您希望提升的文档包含在结果集中,而不管它们是否与特定的过滤器查询匹配,则可以使用 LocalParams 语法标记这些过滤器查询,然后通过 elevate.excludeTags
请求参数指定排除的标记。tag
本地参数和 elevate.excludeTags
请求参数都可以通过用逗号分隔来指定多个值。
q=mainquery&fq=status:public&fq={!tag=dt}doctype:pdf&elevate.excludeTags=dt
q=mainquery&fq=status:public&fq={!tag=t1,t2}a:b&fq={!tag=t3}c:d&fq={!tag=t4}e:f&elevate.excludeTags=t1,t4
当标记排除过滤器时,它不会被完全忽略;而是对其进行修改,以便提升的文档可以通过。未提升的文档仍然受过滤器约束。