文件轉換器

文件轉換器修改查詢結果中返回的有關文件的資訊。

使用文件轉換器

在執行請求時,可以使用文件轉換器,方法是將其包含在 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>
  ...

預設情況下,值會以字串形式傳回,但可以使用 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

此轉換器會傳回符合您查詢的每個父文件的所有子系文件。當您索引巢狀子文件並想要擷取任何類型搜尋查詢的相關父文件的子文件時,這非常有用。

請注意,即使是用來比對結果文件的查詢不是區塊聯結查詢,也可以使用此轉換器。

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,此參數會基於回溯相容性的理由,傳回以管道分隔的所有複本網址列表。

預設樣式可以透過在您的 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) 中功能的值。