文档转换器

文档转换器修改查询结果中关于文档返回的信息。

使用文档转换器

执行请求时,可以通过使用方括号将其包含在 fl 参数中来使用文档转换器,例如

fl=id,name,score,[shard]

一些转换器允许或需要本地参数,这些参数可以指定为方括号内的键值对

fl=id,name,score,[explain style=nl]

与常规字段一样,可以通过前缀更改转换器将字段添加到文档时使用的键

fl=id,name,score,my_val_a:[value v=42 t=int],my_val_b:[value v=7 t=float]

以下部分将详细讨论这些转换器执行的操作。

可用转换器

[value] - ValueAugmenterFactory

修改每个文档以包含完全相同的值,就像它是每个文档中的存储字段一样

q=*:*&fl=id,greeting:[value v='hello']&wt=xml

以上查询将产生以下结果

<result name="response" numFound="32" start="0">
  <doc>
    <str name="id">1</str>
    <str name="greeting">hello</str></doc>
  </doc>
  ...

默认情况下,值以字符串形式返回,但可以使用 t 参数指定 intfloatdoubledate 的值来强制使用特定返回类型

q=*:*&fl=id,my_number:[value v=42 t=int],my_string:[value v=42]

除了使用这些请求参数之外,你还可以配置 ValueAugmenterFactory 的其他命名实例,或在 solrconfig.xml 文件中覆盖现有 [value] 转换器的默认行为

<transformer name="mytrans2" class="org.apache.solr.response.transform.ValueAugmenterFactory" >
  <int name="value">5</int>
</transformer>
<transformer name="value" class="org.apache.solr.response.transform.ValueAugmenterFactory" >
  <double name="defaultValue">5</double>
</transformer>

value 选项强制始终使用显式值,而 defaultValue 选项提供了一个默认值,该值仍可以使用 vt 本地参数进行覆盖。

[说明] - ExplainAugmenterFactory

使用与调试部分中关于每个文档的信息完全相同的方式,为每个文档添加其分数的内联说明

q=features:cache&fl=id,[explain style=nl]

style 支持的值为 texthtmlnl,它会将信息作为结构化数据返回。以下是使用 style=nl 的上述请求的输出

{ "response":{"numFound":2,"start":0,"docs":[
      {
        "id":"6H500F0",
        "[explain]":{
          "match":true,
          "value":1.052226,
          "description":"weight(features:cache in 2) [DefaultSimilarity], result of:",
          "details":[{
}]}}]}}

可以通过在 solrconfig.xml 配置中指定 args 参数来配置默认样式

<transformer name="explain" class="org.apache.solr.response.transform.ExplainAugmenterFactory" >
  <str name="args">nl</str>
</transformer>

[子级] - ChildDocTransformerFactory

此转换器返回与查询匹配的每个父级文档的所有子级文档。当您编制了嵌套子级文档的索引,并且希望为任何类型的搜索查询检索相关父级文档的子级文档时,此功能非常有用。

请注意,即使用于匹配结果文档的查询不是块连接查询,也可以使用此转换器。

q=book_title:Solr&fl=id,[child childFilter=doc_type:chapter limit=100]

如果涉及的文档包含 _nest_path_ 字段,则使用它来使用文档编制索引时的原始伪字段名称重新创建子级文档的层次结构,否则子级文档将作为匿名子级的平面列表返回。

childFilter

可选

默认值:所有子级

用于筛选应包括哪些子级文档的查询。当您有多个级别的层次结构文档时,此功能特别有用。

limit

可选

默认值:-1

要返回在正在扩充的文档下方的子级文档的最大数量。默认值为 -1,表示无限制。

fl

可选

默认值:请参阅说明

转换器要返回的字段列表。默认值为顶级 fl

还有另一个限制,即此处的字段应该是顶级 fl 参数指定的字段的子集。

parentFilter

可选

默认值:无

{!child}/{!parent} 查询解析器中的 of/which 参数具有相同用途:识别“所有父级”集合,以识别每个嵌套文档块的开始和结束。此参数最近已完全变为可选,并且似乎已过时。它可能会在将来的 Solr 版本中被移除,因此如果您发现它有一些用处,请告知项目!

实验性 childFilter 语法

当定义了 _nest_path_ 字段时,childFilter 选项支持一种实验性语法,将“路径语法”限制与更传统的过滤查询结合起来。

此语法通过在包含 : 字符的查询之前包含 / 分隔的路径结构来触发。

当“路径”以 / 字符开头时,它会将匹配限制为具有该“路径”的嵌套伪字段文档的文档,从块的根文档开始(即使正在转换的文档不是根级别文档)。

一些示例

  • childFilter="/skus/*:*"

    • 匹配当前文档的后代文档,且具有 /skus 的“嵌套路径”,但不是这些 skus 的任何子级。

  • childFilter="/skus/color_s:RED"

    • 匹配当前文档的后代文档;匹配 color_s:RED;且具有 /skus 的“嵌套路径”,但不是这些 skus 的任何子级。

  • childFilter="/skus/manuals/*:*"

    • 匹配当前文档的后代文档,且具有 /skus/manuals 的“嵌套路径”,但不是这些 manuals 的任何子级。

当路径不以 / 开头时,它们将被视为“路径后缀”。

  • childFilter="manuals/*:*"

    • 匹配当前文档的后代文档,且具有以“manuals”结尾的“嵌套路径”,无论它们嵌套有多深,但不是这些 manuals 的任何子级。

[shard] - ShardAugmenterFactory

此转换器添加了有关每个文档在分布式请求中来自哪个分片的信息。

q=fl=id,[shard]

style 本地参数可以指定为 id(默认值)或 urls,后者出于向后兼容性的原因返回所有副本 URL 的管道分隔列表。

可以通过在 solrconfig.xml 配置中指定 args 参数来更改默认样式。

<transformer name="shard" class="org.apache.solr.response.transform.ShardAugmenterFactory" >
  <str name="args">urls</str>
</transformer>

[docid] - DocIdAugmenterFactory

此转换器将内部 Lucene 文档 ID 添加到每个文档中 - 这主要仅对调试目的有用。

DocIdAugmenterFactory 不支持任何请求参数或配置选项。

[elevated] 和 [excluded]

仅在使用查询提升组件时才提供这些转换器。

  • [elevated] 注释每个文档以指示它是否被提升。

  • [excluded] 注释每份文档以表明它是否会被排除 - 仅当您同时使用 markExcludes 参数时才支持此功能。

fl=id,[elevated],[excluded]&excludeIds=GB18030TEST&elevateIds=6H500F0&markExcludes=true
{ "response":{"numFound":32,"start":0,"docs":[
      {
        "id":"6H500F0",
        "[elevated]":true,
        "[excluded]":false},
      {
        "id":"GB18030TEST",
        "[elevated]":false,
        "[excluded]":true},
      {
        "id":"SP2514N",
        "[elevated]":false,
        "[excluded]":false},
]}}

[json] / [xml]

这些转换器会用实际原始 XML 或 JSON 结构替换包含有效 XML 或 JSON 结构字符串表示形式的字段值,而不仅仅是字符串值。每个转换器仅适用于特定编写器,因此 [json] 仅适用于 wt=json,而 [xml] 仅适用于 wt=xml

fl=id,source_s:[json]&wt=json

[subquery]

此转换器会对每个转换文档执行一个单独的查询,并将文档字段作为子查询参数的输入传递。它通常与 {!join}{!parent} 查询解析器一起使用,旨在对 [child] 进行改进。

  • 必须为其指定一个唯一名称:fl=*,children:[subquery]

  • 可能有多个,例如 fl=*,sons:[subquery],daughters:[subquery]

  • 每次出现 [subquery] 都会向结果文档中添加一个具有给定名称的字段,此字段的值是一个文档列表,它是使用文档字段作为输入执行子查询的结果。

  • 默认情况下,子查询将使用 /select 搜索处理程序,如果未配置 /select,则会返回错误。可以通过提供 foo.qt 参数来更改此设置。

以下是使用各种格式的外观

XML
  <result name="response" numFound="2" start="0">
      <doc>
         <int name="id">1</int>
         <arr name="title">
            <str>vdczoypirs</str>
         </arr>
         <result name="children" numFound="1" start="0">
            <doc>
               <int name="id">2</int>
               <arr name="title">
                  <str>vdczoypirs</str>
               </arr>
            </doc>
         </result>
      </doc>
  ...
JSON
{ "response":{
    "numFound":2, "start":0,
    "docs":[
      {
        "id":1,
        "subject":["parentDocument"],
        "title":["xrxvomgu"],
        "children":{
           "numFound":1, "start":0,
           "docs":[
              { "id":2,
                "cat":["childDocument"]
              }
            ]
      }}]}}
SolrJ
 SolrDocumentList subResults = (SolrDocumentList)doc.getFieldValue("children");

子查询结果字段

要显示在子查询文档列表中,应在两个 fl 参数中指定一个字段:在主 fl 中(尽管主结果文档没有此字段),以及在子查询的 fl 中(例如 foo.fl)。

可以在这两个参数中的一个或两个中使用通配符。例如,如果字段 title 应显示在类别子查询中,则可以通过以下方式之一完成

fl=...title,categories:[subquery]&categories.fl=title&categories.q=...
fl=...title,categories:[subquery]&categories.fl=*&categories.q=...
fl=...*,categories:[subquery]&categories.fl=title&categories.q=...
fl=...*,categories:[subquery]&categories.fl=*&categories.q=...

子查询参数转换

如果子查询声明为 fl=*,foo:[subquery],则子查询参数会以给定名称和句点为前缀。例如

q=*:*&fl=*,**foo**:[subquery]&**foo.**q=to be continued&**foo.**rows=10&**foo.**sort=id desc

文档字段作为子查询参数的输入

必须将某些文档字段值作为参数传递给子查询。它通过隐式 row.fieldname 参数支持,并且可以(但可能不仅仅)通过本地参数语法引用

q=name:john&fl=name,id,depts:[subquery]&depts.q={!terms f=id v=$row.dept_id}&depts.rows=10

在此,每个搜索结果中的员工都会检索到部门。我们可以说它就像 SQL join ON emp.dept_id=dept.id

请注意,当文档字段具有多个值时,它们默认情况下会用逗号连接。可以使用本地参数 foo:[subquery separator=' '] 更改此设置,这模仿 {!terms} 以便与之平滑配合。

要记录替换的子查询请求参数,请添加相应的参数名称,如下所示:depts.logParamsList=q,fl,rows,row.dept_id

SolrCloud 中的核心和集合

使用 foo:[subquery fromIndex=departments] 在同一节点上的另一个核心上调用子查询。这是 {!join} 在用户管理的集群中所执行的操作。使用 SolrCloud 时,仅为子查询指定其本机参数,例如 collection, shards,例如

q=*:*&fl=\*,foo:[subquery]&foo.q=cloud&foo.collection=departments

如果子查询集合具有不同的唯一键字段名称(例如主集合中的 foo_id 而不是 id),则添加以下参数以适应此差异

foo.fl=id:foo_id&foo.distrib.singlePass=true

否则,您将从 QueryComponent.mergeIds 获得 NullPointerException

[geo] - 地理空间格式化程序

使用指定的格式类型名称对来自空间字段的空间数据进行格式化。需要两个内部参数:用于字段名称的 f 和用于格式名称的 w。示例:geojson:[geo f=mySpatialField w=GeoJSON]

通常,您只需通过将空间字段类型上的 format 属性设置为 WKTGeoJSON 来始终如一地选择所需的格式类型——有关更多信息,请参阅 空间搜索 部分。如果您始终如一,它将按照您存储它的方式显示出来。此转换器提供了一种便利,可以在检索时将空间格式转换为其他格式。

此外,此功能与 RptWithGeometrySpatialField 结合使用非常有用,以避免潜在的大矢量几何的双重存储。此转换器将检测该字段类型并从磁盘上的内部紧凑二进制表示(在 docValues 中)获取几何,然后根据需要对其进行格式化。因此,您不必将该字段标记为已存储,这将是多余的。从某种意义上说,docValues 和存储值存储之间的这种双重存储并不仅限于空间,但对于多边形几何,它可能包含大量数据,而且您还想避免以冗长格式(如 GeoJSON 或 WKT)存储它。

[features] - LTRFeatureLoggerTransformerFactory

“LTR” 前缀代表 学习进行排名。此转换器返回特征的值,可用于特征提取和特征记录。

fl=id,[features store=yourFeatureStore]

这将返回 yourFeatureStore 存储中的特征值。

fl=id,[features]&rq={!ltr model=yourModel}

如果将 [features] 与学习进行排名重新排序查询结合使用,则将返回重新排序模型 (yourModel) 中特征的值。