请求处理程序和搜索组件
在 solrconfig.xml
的 <query>
部分之后,配置请求处理程序和搜索组件。
请求处理程序 处理发送到 Solr 的请求。这些可能是查询请求、索引更新请求或诸如 Ping 之类的专门交互。
并非所有处理程序都在 solrconfig.xml
中显式定义,许多是隐式定义的。有关详细信息,请参阅 隐式请求处理程序。
此外,可以通过使用 配置 API 在 configoverlay.json
中定义或覆盖处理程序。最后,还可以通过 请求参数 API 定义独立的参数集。它们将存储在 params.json
文件中,并使用 useParams 引用。
可以通过 配置 API 验证所有这些多层配置。
定义自己的配置处理程序通常是提供默认值和高级配置以支持业务案例并简化客户端 API 的有用方法。同时,使用本指南中解释的每个选项,肯定会对何时实际使用哪个参数造成一些混淆。
定义和调用请求处理程序
每个请求处理程序都使用名称和类定义。请求处理程序的名称使用对 Solr 的请求进行引用,通常作为路径。例如,如果 Solr 安装在 http://localhost:8983/solr/
,并且您有一个名为“gettingstarted”的集合,则可以发出如下所示的请求
http://localhost:8983/solr/gettingstarted/select?q=solr
此查询将由名称为 /select
的请求处理程序进行处理。我们在此仅使用了“q”参数,其中包括我们的查询项,即简单的关键字“solr”。如果请求处理程序定义了更多默认参数,则除非在查询本身中由客户端(或用户)覆盖,否则这些参数将与我们发送到该请求处理程序的任何查询一起使用。
如果您定义了另一个请求处理程序,则可以使用该名称发送请求。例如,/update
是一个隐式请求处理程序,用于处理索引更新(即向索引发送新文档)。默认情况下,/select
是一个请求处理程序,用于处理查询请求,并且是大多数示例和工具所期望的。
请求处理程序还可以处理其名称中嵌套路径的请求,例如,使用 /myhandler/extrapath
的请求可以由使用名称 /myhandler
注册的请求处理程序进行处理。如果通过名称 /myhandler/extrapath
明确定义了请求处理程序,则它将优先于嵌套路径。这假设您正在使用 Solr 附带的请求处理程序类;如果您创建自己的请求处理程序,则如果要将其与自定义请求处理程序一起使用,则应确保它包括处理嵌套路径的能力。
如果预计不会经常使用请求处理程序,则可以将其标记为 startup="lazy"
以避免在需要时才加载。
<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
...
</requestHandler>
配置请求处理程序
有 3 种方法可以在其定义中配置请求处理程序,还有 3 种方法可以在其他地方配置它们。
请求参数(GET 和 POST)
最简单、最灵活的方法是使用标准 GET 或 POST 请求提供参数。
以下是如何将参数 id
、fl
和 wt
发送到 /select
搜索处理程序的示例。请注意,fl
参数值的 URL 编码空格(为 +)。
http://localhost:8983/solr/techproducts/select?q=id:SP2514N&fl=id+name&wt=xml
以下是使用 JSON 请求 API 通过 POST 表单将参数发送到 /query
搜索处理程序的示例。
curl http://localhost:8983/solr/techproducts/query -d '
{
"query" : "memory",
"filter" : "inStock:true"
}'
无论哪种方式,都会提取参数并将其与下面解释的其他选项结合起来。
默认值、追加和不变项
默认值
配置请求处理程序的最常见方法是提供 defaults
部分。除非被任何其他方法覆盖,否则将使用那里的参数。
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
</lst>
</requestHandler>
此示例定义了一个有用的故障排除参数 echoParams,其值仅返回请求本身中定义的参数(无默认值),将其设置为 all
以获取更多信息。它还定义了 rows
参数,其中包含要返回的结果数(每页)(实际上 10 是一个真正的默认值,因此这是一个冗余定义,如果您不打算修改它)。
还要注意,如果参数是字符串、整数或其他类型,则在列表中定义默认值的方式会有所不同。
以下是表示其他一些基本类型的方式
<lst name="defaults">
<float name="hl.regex.slop">0.5</float>
<bool name="default">true</bool>
</lst>
可能存在其他专门类型,它们将在相关组件的部分中进行解释。
附加项
在 appends
部分中,您可以定义添加到其他地方已定义的参数。当同一个参数可以有意义地多次定义时,这很有用,例如对于 过滤器查询。Solr 中没有允许客户端覆盖这些添加项的机制,因此您应该绝对确定始终希望将这些参数应用于查询。
<lst name="appends">
<str name="fq">inStock:true</str>
</lst>
在此示例中,过滤器查询 inStock:true
将始终添加到每个查询中,强制仅返回可用的“产品”。
不变项
在 invariants
部分中,您可以定义客户端无法覆盖的参数。无论用户、客户端、在 defaults
中还是在 appends
中指定的值如何,invariants
部分中定义的值都将始终使用。
<lst name="invariants">
<str name="facet.field">cat</str>
<str name="facet.field">manu_exact</str>
<str name="facet.query">price:[* TO 500]</str>
<str name="facet.query">price:[500 TO *]</str>
</lst>
在此示例中,facet.field
和 facet.query
参数将被修复,限制客户端可以使用的小组。默认情况下,分组功能未开启 - 但如果客户端在请求中指定 facet=true
,这些是他们唯一能够看到计数的小组;无论他们可能指定什么其他 facet.field
或 facet.query
参数。
InitParams
还可以使用名为 initParams
的部分为请求处理程序配置默认值。当您希望使用每个单独处理程序都将使用的公共属性时,可以使用这些默认值。例如,如果您打算创建几个请求处理程序,它们都将在响应中请求相同的字段列表,则可以使用字段列表配置 initParams
部分。有关 initParams
的更多信息,请参阅部分 InitParams。
Paramsets 和 UseParams
如果您希望经常更改参数,或者如果您想定义可以即时应用的参数集,则可以使用 请求参数 API 定义它们,然后通过在处理程序定义本身或作为查询参数在 useParams
设置中提供一个或多个参数来调用它们。
<requestHandler name="/terms" class="solr.SearchHandler" useParams="myQueries">
...
</requestHandler>
http://localhost/solr/techproducts/select?useParams=myFacets,myQueries
如果调用了 paramset 但未定义,则会忽略它。这允许大多数 隐式请求处理程序 根据需要调用您可以稍后定义的特定 paramset。
搜索处理程序
搜索处理程序对 Solr 非常重要,因为数据(大致)编制索引一次,但搜索多次。Solr(和 Lucene)的整个设计都是针对搜索优化数据,而搜索处理程序是实现这一目标的灵活网关。
搜索处理程序中允许以下部分
<requestHandler name="/select" class="solr.SearchHandler">
... defaults/appends/invariants
... first-components/last-components or components
... shardHandlerFactory
</requestHandler>
所有块都是可选的,特别是由于也可以使用 initParams
和 useParams
提供参数。
默认值/追加/不变块之前已在 默认值、追加和不变 中描述。所有查询参数都可以定义为任何搜索处理程序的参数。
接下来描述搜索组件块,而 shardHandlerFactory 用于微调 SolrCloud 分布式请求。
定义搜索组件
搜索组件本身在请求处理程序外部定义,然后在希望使用它们的各种搜索处理程序中引用。大多数搜索处理程序使用默认(隐式)搜索组件堆栈,有时只需要用附加的预先添加或追加的组件对其进行扩充。完全覆盖组件堆栈的情况非常罕见(而且有些脆弱),尽管在示例中使用它来清楚地演示特定搜索组件的效果。
默认组件
如下所示,我们看到的搜索体验主要是下面定义的一系列组件。它们按列出的顺序调用。
组件名称 | 类名 | 更多信息 |
---|---|---|
query |
|
在 查询语法和解析器 部分中进行描述。 |
facet |
|
基于原始参数的 facet 组件,在 分面 部分中进行描述。 |
facet_module |
|
JSON 分面和分析模块,在 JSON 分面 API 部分中进行描述。 |
mlt |
|
在 MoreLikeThis 部分中进行描述。 |
highlight |
|
在 突出显示 部分中进行描述。 |
stats |
|
在 统计组件 部分中进行描述。 |
expand |
|
在 折叠和展开结果 部分中进行描述。 |
terms |
|
在 术语组件 部分中进行描述。 |
debug |
|
在 debug 参数 部分中进行描述。 |
已发布的自定义组件
除了默认组件之外,Solr 还附带了许多其他非常有用的组件。它们需要在 solrconfig.xml
中定义和引用才能实际使用。
-
AnalyticsComponent
,在 分析组件 部分中进行描述(已弃用)。 -
ClusteringComponent
,在 结果聚类 部分中进行描述。 -
PhrasesIdentificationComponent
,用于根据索引字段中的分词来识别和评分输入字符串中找到的“短语”,在 PhrasesIdentificationComponent javadoc 中进行描述。 -
QueryElevationComponent
,在 查询提升组件 部分中描述。 -
RealTimeGetComponent
,在 实时获取 部分中描述。 -
ResponseLogComponent
,用于记录通过 Solr 日志返回给用户的文档,在 ResponseLogComponent javadoc 中描述。 -
SpellCheckComponent
,在 拼写检查 部分中描述。 -
SuggestComponent
,在 建议器 部分中描述。 -
TermVectorComponent
,在 词向量组件 部分中描述。
一些第三方组件也链接自 https://solr.cool/ 网站。
定义自定义搜索组件
要定义自定义组件,语法如下
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="classname">solr.IndexBasedSpellChecker</str>
...
</lst>
</searchComponent>
自定义组件通常具有此处未描述的配置元素。有关详细信息,请查看特定组件的文档/示例。
注意:如果您使用默认名称之一注册新搜索组件,则将使用新定义的组件,而不是默认组件。这允许覆盖特定组件,同时不必过多担心 Solr 的升级。
引用搜索组件
可以将一些组件定义为在上面列出的默认组件之前(使用 first-components
)或之后(使用 last-components
)使用。
<searchComponent name="..." class="...">
<arr name="first-components">
<str>mycomponent</str>
</arr>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</searchComponent>
以“debug”名称注册的组件将始终在“last-components”之后执行 |
如果您定义 components
,则不会执行 默认组件,并且不允许使用 first-components
和 last-components
。这应被视为最后的手段,因为默认列表可能会在以后的 Solr 版本中更改。
<searchComponent name="..." class="...">
<arr name="components">
<str>mycomponent</str>
<str>query</str>
<str>debug</str>
</arr>
</searchComponent>
更新请求处理程序
更新请求处理程序是处理索引更新的请求处理程序。大多数可用的更新请求处理程序都是 隐式的,可以通过定义正确命名的 Paramset 来对其进行自定义。
如果您需要定义其他更新请求处理程序,语法如下
<requestHandler name="/update/json" class="solr.UpdateRequestHandler">
... defaults/appends/invariants
</requestHandler>
完整详细信息在 使用更新处理程序进行索引 部分中介绍。
与用于搜索处理程序的搜索组件类似,Solr 具有用于更新请求处理程序的文档预处理插件,称为 更新请求处理器,它还允许使用默认和自定义配置链。
注意:不要将更新请求处理程序与 solrconfig.xml
中定义的 updateHandler
部分混淆。