Solr文檔轉(zhuǎn)換器

2018-11-28 15:36 更新

Solr文檔轉(zhuǎn)換器可用于修改查詢結(jié)果中返回的有關(guān)每個(gè)文檔的信息。

使用文件轉(zhuǎn)換器

在執(zhí)行請(qǐng)求時(shí),可以使用方括號(hào)將文檔轉(zhuǎn)換器包含在 fl 參數(shù)中,例如:

fl=id,name,score,[shard]

一些轉(zhuǎn)換器允許或要求可以在括號(hào)內(nèi)指定為鍵值對(duì)的本地參數(shù):

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

與常規(guī)字段一樣,您可以更改 Transformer 通過前綴向文檔添加字段時(shí)使用的鍵:

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

以下各節(jié)將詳細(xì)討論這些轉(zhuǎn)換器的功能。

可用轉(zhuǎn)換器

[Value] - ValueAugmenterFactory

修改每個(gè)文檔以包含完全相同的值,就像它是每個(gè)文檔中的存儲(chǔ)字段一樣:

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

上面的查詢會(huì)產(chǎn)生如下結(jié)果:

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

默認(rèn)情況下,值以字符串的形式返回,但是可以使用 int、float、double 或 date 的值指定 “t” 參數(shù)來強(qiáng)制指定返回類型:

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

除了使用這些請(qǐng)求參數(shù)之外,還可以配置 ValueAugmenterFactory 的其他命名實(shí)例,或覆蓋 solrconfig.xml 文件中現(xiàn)有 [value] 轉(zhuǎn)換器的默認(rèn)行為:

<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”選項(xiàng)強(qiáng)制使用一個(gè)顯式值,而“ defaultValue”選項(xiàng)提供了一個(gè)默認(rèn)值,仍然可以使用“ v”和“ t”本地參數(shù)覆蓋。

[explain] - ExplainAugmenterFactory

與 "調(diào)試" 部分中每個(gè)文檔的可用信息完全一樣,對(duì)每個(gè)文檔的分?jǐn)?shù)進(jìn)行一個(gè)內(nèi)聯(lián)解釋:

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

用于 style 支持的值是 text、html 和 nl,它以結(jié)構(gòu)化數(shù)據(jù)的形式返回信息:

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

默認(rèn)樣式可以通過在您的配置中指定一個(gè)“args” 參數(shù)進(jìn)行配置:

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

[child] - ChildDocTransformerFactory

此轉(zhuǎn)換器返回與您的查詢匹配的每個(gè)父文檔的所有子代文檔,該列表嵌套在匹配的父文檔內(nèi)。當(dāng)您為嵌套的子文檔編制索引并且想要為任何類型的搜索查詢檢索相關(guān)父文檔的子文檔時(shí),這非常有用。

fl=id,[child parentFilter=doc_type:book childFilter=doc_type:chapter limit=100]

請(qǐng)注意,即使查詢本身不是塊聯(lián)接查詢,也可以使用此轉(zhuǎn)換器。

使用此變換器時(shí),必須指定 parentFilter 參數(shù),并且與所有塊聯(lián)接查詢的工作方式相同,其他可選參數(shù)為:

  • childFilter - 查詢過濾應(yīng)包含哪些子文檔,當(dāng)您有多層次的分層文檔(默認(rèn):所有子項(xiàng))時(shí),這可能特別有用。
  • limit - 每個(gè)父文檔要返回的最大子文檔數(shù)量(默認(rèn)值:10)

[shard] - ShardAugmenterFactory

這個(gè)轉(zhuǎn)換器在分布式請(qǐng)求中添加有關(guān)每個(gè)文檔碎片的信息。

ShardAugmenterFactory 不支持任何請(qǐng)求參數(shù)或配置選項(xiàng)。

[docid] - DocIdAugmenterFactory

這個(gè)轉(zhuǎn)換器將 Lucene 的內(nèi)部文檔 ID 添加到每個(gè)文檔 - 這僅用于調(diào)試目的。

DocIdAugmenterFactory 不支持任何請(qǐng)求參數(shù)或配置選項(xiàng)。

[elevated] 和 [excluded]

這些轉(zhuǎn)換器僅在使用查詢高程組件時(shí)可用。

  • [elevated] 注釋每個(gè)文件以指示是否升高。
  • [excluded] 注釋每個(gè)文檔以指示是否已被排除 - 僅當(dāng)您也使用 markExcludes 參數(shù)時(shí)才支持。
    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]

這些轉(zhuǎn)換器將包含有效 XML 或 JSON 結(jié)構(gòu)的字符串表示形式的字段值替換為實(shí)際的原始 XML 或 JSON 結(jié)構(gòu),而不僅僅是字符串值。每一種 [json] 都只適用于特定的編寫器,這樣只適用于wt=json 并且 [xml] 只適用于 wt=xml。

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

[subquery]

此轉(zhuǎn)換器將每個(gè)轉(zhuǎn)換文檔傳遞文檔字段的單獨(dú)查詢作為子查詢參數(shù)的輸入執(zhí)行。它通常與 {! join} 和 {! 父} 查詢解析器一起使用,旨在改進(jìn) [child]。

  • 必須給它一個(gè)唯一的名字: fl=*,children:[subquery]
  • 可能會(huì)有幾個(gè),例如:fl=*,sons:[subquery],daughters:[subquery]。
  • 每個(gè) [subquery] 出現(xiàn)都會(huì)在給定名稱的結(jié)果文檔中添加一個(gè)字段,該字段的值是一個(gè)文檔列表,這是使用文檔字段作為輸入執(zhí)行子查詢的結(jié)果。

以下是各種格式的外觀:

 <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>
  ...
{ "response":{
    "numFound":2, "start":0,
    "docs":[
      {
        "id":1,
        "subject":["parentDocument"],
        "title":["xrxvomgu"],
        "children":{
           "numFound":1, "start":0,
           "docs":[
              { "id":2,
                "cat":["childDocument"]
              }
            ]
      }}]}}
SolrDocumentList subResults = (SolrDocumentList)doc.getFieldValue("children");

子查詢結(jié)果字段

為了出現(xiàn)在子查詢文檔列表中,一個(gè)字段應(yīng)該同時(shí)指定兩個(gè) fl 參數(shù),在主要的一個(gè) fl(盡管主要的結(jié)果文檔沒有這個(gè)字段)和在子查詢的一個(gè),例如:foo.fl。當(dāng)然,您可以在這些參數(shù)中的任何一個(gè)或兩個(gè)中使用通配符。例如,如果字段標(biāo)題應(yīng)該出現(xiàn)在類別子查詢中,則可以通過以下方式之一來完成。

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

子查詢參數(shù) Shift

如果子查詢被聲明為:fl=*,foo:[subquery],則子查詢參數(shù)以給定的名稱和句點(diǎn)作為前綴。例如:

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

文檔字段作為子查詢參數(shù)的輸入

必須將某些文檔字段值作為子查詢的參數(shù)傳遞。它通過隱式 row.fieldname 參數(shù)支持,可以(但可能不只是)通過本地參數(shù)語法來引用:

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

搜索結(jié)果中,每個(gè)員工都會(huì)找到門衛(wèi)。我們可以說它就像 SQL 加入 ON emp.dept_id=dept.id 一樣。

請(qǐng)注意,當(dāng)文檔字段有多個(gè)值時(shí),它們默認(rèn)與逗號(hào)連接,可以通過本地參數(shù) foo:[subquery separator=' '] 進(jìn)行更改,這樣模擬{!terms}可以使用它。

要記錄替代的子查詢請(qǐng)求參數(shù),請(qǐng)?zhí)砑酉鄳?yīng)的參數(shù)名稱,如:depts.logParamsList=q,fl,rows,row.dept_id

SolrCloud 中的核心和集合

使用 foo:[subquery fromIndex=departments] 來調(diào)用同一節(jié)點(diǎn)上的另一個(gè)核心子查詢,這是 {! join} 用于非 SolrCloud 模式。但是在 SolrCloud 的情況下(只有)明確地指定了其子查詢的本地參數(shù) collection、shards ,例如:

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

如果子查詢集合具有不同的唯一鍵字段名稱 (假設(shè) foo_id 與主集合中的 id 相反),則添加以下參數(shù)以適應(yīng)此差異:foo.fl=id:foo_id&foo.distrib.singlePass=true。否則你就會(huì)從 QueryComponent.mergeIds 得到 NullPoniterException。

[geo] - Geospatial formatter

使用指定的格式類型名稱,從空間字段中設(shè)置空間數(shù)據(jù)的格式。需要兩個(gè)內(nèi)部參數(shù):f 用于字段名,w 用于格式名。例如:geojson:[geo f=mySpatialField w=GeoJSON]。

通常情況下,通過將 format 空間字段類型上的屬性設(shè)置為 WKT 或者 GeoJSON,您可以簡單地選擇所需的格式類型。有關(guān)更多信息,請(qǐng)參閱空間搜索部分。如果是一致的話,它會(huì)以你存儲(chǔ)它的方式出來。這個(gè)轉(zhuǎn)換器提供了一個(gè)方便的空間格式轉(zhuǎn)換為不同的檢索。

另外,這個(gè)功能對(duì)于 RptWithGeometrySpatialField 避免雙向存儲(chǔ)潛在的大型矢量幾何體非常有用。該轉(zhuǎn)換器將檢測(cè)該字段類型并從磁盤上的內(nèi)部緊湊二進(jìn)制表示(在 docValues 中)獲取幾何圖形,然后根據(jù)需要對(duì)其進(jìn)行格式化。因此,您不需要將該字段標(biāo)記為已存儲(chǔ),這將是多余的。從某種意義上說,docValue 和存儲(chǔ)值存儲(chǔ)之間的雙重存儲(chǔ)并不是空間唯一的,而是具有多邊形的幾何體,它可以是大量的數(shù)據(jù),而且您希望避免將其存儲(chǔ)為冗長的格式(如 GeoJSON 或 WKT)。

[features] - LTRFeatureLoggerTransformerFactory

“LTR”前綴代表學(xué)習(xí)排序。這個(gè)轉(zhuǎn)換器返回函數(shù)的值,它可以用于函數(shù)提取和函數(shù)記錄。

fl=id,[features store=yourFeatureStore]

這將返回 yourFeatureStore 存儲(chǔ)中函數(shù)的值。

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

如果 [features] 與“學(xué)習(xí)排序”重新排??列查詢一起使用,則將返回重新排序模型(yourModel )中的函數(shù)值。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)