文档转换器

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

使用文档转换器

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

fl=id,name,score,[shard]

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

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

与常规字段一样,您可以通过前缀更改 Transformer 向文档添加字段时使用的键

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>
  ...

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

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

除了使用这些请求参数外,您还可以在 solrconfig.xml 文件中配置 ValueAugmenterFactory 的其他命名实例,或覆盖现有 [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 本地参数覆盖。

[explain] - 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>

[child] - ChildDocTransformerFactory

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

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

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 应出现在 categories 子查询中,可以通过以下方式之一完成

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) 中特征的值。