请求处理器和搜索组件

solrconfig.xml<query> 部分之后,配置请求处理器和搜索组件。

请求处理器处理发送到 Solr 的请求。这些可能是查询请求、索引更新请求或专门的交互,例如 Ping

并非所有处理器都在 solrconfig.xml 中显式定义,许多处理器是隐式定义的。有关详细信息,请参阅 隐式请求处理器

此外,可以通过使用 配置 APIconfigoverlay.json 中定义或覆盖处理器。最后,也可以通过 请求参数 API 定义独立的参数集。它们将存储在 params.json 文件中,并通过 useParams 引用。

所有这些多层配置都可以通过 配置 API 进行验证。

定义您自己的配置处理器通常是为支持业务案例和简化客户端 API 提供默认值和高级配置的有用方法。同时,使用本指南中解释的每一个选项,肯定会导致对实际使用哪个参数感到困惑。

定义和调用请求处理器

每个请求处理器都使用名称和类进行定义。请求处理器的名称在对 Solr 的请求中引用,通常作为路径。例如,如果 Solr 安装在 https://127.0.0.1:8983/solr/,并且您有一个名为 "gettingstarted" 的集合,则可以发出如下请求

https://127.0.0.1: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 请求提供参数。

以下是将参数 idflwt 发送到 /select 搜索处理程序的示例。请注意,fl 参数的值的 URL 编码空格(为 +)。

https://127.0.0.1:8983/solr/techproducts/select?q=id:SP2514N&fl=id+name&wt=xml

以下示例是通过 POST 表单使用 JSON 请求 API 将参数发送到 /query 搜索处理程序的示例。

curl https://127.0.0.1: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)

appends 部分,您可以定义添加到其他地方已定义的参数。当同一个参数可以被多次有意义地定义时,例如对于 过滤器查询,这些参数非常有用。Solr 中没有机制允许客户端覆盖这些添加项,因此您应该绝对确定始终希望将这些参数应用于查询。

<lst name="appends">
  <str name="fq">inStock:true</str>
</lst>

在此示例中,过滤器查询 inStock:true 将始终添加到每个查询中,强制仅返回可用的“产品”。

不变参数(Invariants)

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.fieldfacet.query 参数将被固定,限制客户端可以使用的 facet。默认情况下不会启用 Faceting,但如果客户端在请求中指定 facet=true,则无论他们可能指定什么其他 facet.fieldfacet.query 参数,他们都只能看到这些 facet 的计数。

InitParams

还可以使用名为 initParams 的部分为请求处理程序配置默认值。当您想要拥有每个单独的处理程序都将使用的公共属性时,可以使用这些默认值。例如,如果您打算创建多个请求处理程序,它们都将在响应中请求相同的字段列表,则可以使用您的字段列表配置 initParams 部分。有关 initParams 的更多信息,请参阅 InitParams 部分。

参数集(Paramsets)和 UseParams

如果您希望经常更改参数,或者想要定义可以动态应用的参数集,可以使用 请求参数 API 定义它们,然后在处理程序定义本身中或作为查询参数,通过提供一个或多个 useParams 设置来调用它们。

<requestHandler name="/terms" class="solr.SearchHandler" useParams="myQueries">

...
</requestHandler>
https://127.0.0.1/solr/techproducts/select?useParams=myFacets,myQueries

如果调用了未定义的参数集,则会忽略它。这允许大多数 隐式请求处理程序 调用您可以稍后根据需要定义的特定参数集。

搜索处理程序

搜索处理程序对 Solr 非常重要,因为数据(大致)索引一次,但会被搜索多次。Solr(和 Lucene)的整个设计都在优化用于搜索的数据,而搜索处理程序是通向该数据的灵活网关。

以下部分允许在搜索处理程序中使用

<requestHandler name="/select" class="solr.SearchHandler">
... defaults/appends/invariants
... first-components/last-components or components
... shardHandlerFactory
</requestHandler>

所有块都是可选的,特别是自从也可以使用 initParamsuseParams 提供参数以来。

defaults/appends/invariants 块已在前面的 默认值、追加和不变参数 中进行了描述。所有查询参数都可以定义为任何搜索处理程序的参数。

接下来将介绍搜索组件块,而 shardHandlerFactory 用于微调 SolrCloud 分布式请求。

定义搜索组件

搜索组件本身在请求处理程序之外定义,然后从想要使用它们的各种搜索处理程序引用。大多数搜索处理程序使用默认的隐式搜索组件堆栈,并且有时只需要使用前置或后置的附加组件来增强它们。完全覆盖组件堆栈的情况非常罕见且有些脆弱,尽管在示例中会使用它来清楚地演示特定搜索组件的效果。

默认组件

如下所示,我们所看到的搜索体验主要是下面定义的一系列组件。它们按列出的顺序调用。

组件名称 类名 更多信息

query

solr.QueryComponent

查询语法和解析器 部分中描述。

facet

solr.FacetComponent

Faceting 部分中描述的原始基于参数的 facet 组件。

facet_module

solr.facet.FacetModule

JSON Facet API 部分中描述的 JSON Faceting 和分析模块。

mlt

solr.MoreLikeThisComponent

MoreLikeThis 部分中描述。

highlight

solr.HighlightComponent

高亮显示 部分中描述。

stats

solr.StatsComponent

统计组件 部分中描述。

expand

solr.ExpandComponent

折叠和展开结果 部分中描述。

terms

solr.TermsComponent

Terms 组件 部分中描述。

debug

solr.DebugComponent

debug 参数 部分中描述。

随附的自定义组件

除了默认组件外,Solr 还随附了许多附加的非常有用的组件。它们需要在 solrconfig.xml 中定义和引用才能实际使用。

  • AnalyticsComponent,在 分析组件 部分中描述(已弃用)。

  • ClusteringComponent,在 结果聚类 部分中描述。

  • PhrasesIdentificationComponent,用于基于索引字段中的 shingles 识别和评分输入字符串中找到的“短语”,在 PhrasesIdentificationComponent javadocs 中描述。

  • QueryElevationComponent,在 查询提升组件 部分中描述。

  • RealTimeGetComponent,在 实时获取 部分中描述。

  • ResponseLogComponent,用于通过 Solr 日志记录返回给用户的文档,在 ResponseLogComponent javadocs 中描述。

  • 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-componentslast-components。这应视为最后选择,因为默认列表可能会在以后的 Solr 版本中更改。

<searchComponent name="..." class="...">
    <arr name="components">
      <str>mycomponent</str>
      <str>query</str>
      <str>debug</str>
    </arr>
</searchComponent>

更新请求处理程序

更新请求处理程序是处理索引更新的请求处理程序。大多数可用的更新请求处理程序都是隐式的,可以通过定义正确命名的参数集进行自定义。

如果您需要定义其他更新请求处理程序,语法是

<requestHandler name="/update/json" class="solr.UpdateRequestHandler">
... defaults/appends/invariants
</requestHandler>

完整详细信息在 使用更新处理程序进行索引 部分中介绍。

与搜索处理程序的搜索组件类似,Solr 具有用于更新请求处理程序的文档预处理插件,称为 更新请求处理器,它们也允许默认和自定义配置链。

注意:不要将更新请求处理程序与在 solrconfig.xml 中定义的 updateHandler 部分混淆。