文件轉換器
文件轉換器修改查詢結果中返回的有關文件的資訊。
使用文件轉換器
在執行請求時,可以使用文件轉換器,方法是將其包含在 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>
...
預設情況下,值會以字串形式傳回,但可以使用 int
、float
、double
或 date
的值來指定 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
選項則提供可以使用 v
和 t
本機參數覆寫的預設值。
[explain] - ExplainAugmenterFactory
使用其分數的內嵌說明來擴充每個文件,與除錯區段中提供的每個文件的資訊完全相同
q=features:cache&fl=id,[explain style=nl]
style
的支援值為 text
、html
和 nl
,後者會將資訊以結構化資料形式傳回。以下是使用 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 語法當定義 此語法會透過在包含 當「路徑」以 一些範例
當路徑不是以
|
[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
參數來變更此設定。
以下說明使用各種格式的方式
<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");
子查詢結果欄位
若要顯示在子查詢文件列表中,應在 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
如果子查詢集合具有不同的唯一鍵欄位名稱 (例如主要集合中的
否則,您會從 |
[geo] - 地理空間格式器
使用指定格式類型名稱,格式化空間欄位中的空間資料。需要兩個內部參數:f
代表欄位名稱,而 w
代表格式名稱。範例:geojson:[geo f=mySpatialField w=GeoJSON]
。
通常,您只需在空間欄位類型上設定 format
屬性為 WKT
或 GeoJSON
,藉此一致地選擇您想要的格式類型 – 請參閱 空間搜尋一節以取得更多資訊。如果您保持一致,它會以您儲存的方式呈現。此轉換器提供一種便利方式,可在擷取時將空間格式轉換為其他格式。
此外,此功能對於 RptWithGeometrySpatialField
非常有用,可避免重複儲存可能很大的向量幾何。此轉換器將會偵測該欄位類型,並從磁碟上的內部壓縮二進位表示法 (在 docValues 中) 擷取幾何,然後根據需要格式化。如此一來,您不需要將該欄位標記為已儲存,因為這會是多餘的。從某種意義上來說,docValues 和儲存值儲存之間的雙重儲存並非空間專有,但使用多邊形幾何時,它可能會有很多資料,而且您會想避免以詳細的格式 (如 GeoJSON 或 WKT) 儲存它。
[features] - LTRFeatureLoggerTransformerFactory
「LTR」前綴代表 學習排名。此轉換器會傳回功能的值,而且可用於功能擷取和功能記錄。
fl=id,[features store=yourFeatureStore]
這會傳回 yourFeatureStore
儲存區中功能的值。
fl=id,[features]&rq={!ltr model=yourModel}
如果您將 [features]
與「學習排名」重新排名查詢一起使用,則會傳回重新排名模型 (yourModel
) 中功能的值。