回應寫入器
JSON 回應寫入器
預設的 Solr 回應寫入器是 JsonResponseWriter
,它會以 JavaScript 物件表示法 (JSON) 格式化輸出,JSON 是一種 RFC 4627 中指定的輕量級資料交換格式。當以下情況發生時,會使用預設的回應寫入器:
-
請求中未指定
wt
參數,或 -
指定了不存在的回應寫入器。
以下是簡單查詢 (例如 q=id:VS1GB400C3
) 的範例回應
{
"responseHeader":{
"zkConnected":true,
"status":0,
"QTime":7,
"params":{
"q":"id:VS1GB400C3"}},
"response":{"numFound":1,"start":0,"maxScore":2.3025851,"docs":[
{
"id":"VS1GB400C3",
"name":["CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail"],
"manu":["Corsair Microsystems Inc."],
"manu_id_s":"corsair",
"cat":["electronics",
"memory"],
"price":[74.99],
"popularity":[7],
"inStock":[true],
"store":["37.7752,-100.0232"],
"manufacturedate_dt":"2006-02-13T15:26:37Z",
"payloads":["electronics|4.0 memory|2.0"],
"_version_":1549728120626479104}]
}}
JSON 寫入器的預設 MIME 類型是 application/json
,但是可以在 solrconfig.xml
中覆寫此類型 - 例如,以下來自「techproducts」configset 的範例
<queryResponseWriter name="json" class="solr.JSONResponseWriter">
<!-- For the purposes of the tutorial, JSON response are written as
plain text so that it's easy to read in *any* browser.
If you are building applications that consume JSON, just remove
this override to get the default "application/json" mime type.
-->
<str name="content-type">text/plain</str>
</queryResponseWriter>
如果您使用 JSON 格式化的回應與 JSONP 跨邊界查詢,則當瀏覽器預期 application/json 時,讓 Solr 回應 text/plain MIME 類型將會觸發瀏覽器封鎖請求。 |
JSON 特有參數
json.nl
此參數控制 NamedLists 的輸出格式,其中順序比依名稱存取更重要。NamedList 目前用於欄位分面資料。
json.nl
參數採用下列值
flat
-
預設值。NamedList 表示為扁平陣列,交替使用名稱和值。
輸入
NamedList("a"=1, "bar"="foo", null=3, null=null)
,輸出將為["a",1, "bar","foo", null,3, null,null]
。 map
-
NamedList 以 JSON 物件的形式呈現。雖然這是最簡單的對應方式,但 NamedList 可以擁有選擇性的鍵、重複的鍵,並保留順序。使用 JSON 物件(本質上是一個 map 或 hash)來表示 NamedList 會導致某些資訊的遺失。
輸入為
NamedList("a"=1, "bar"="foo", null=3, null=null)
,輸出將會是{"a":1, "bar":"foo", "":3, "":null}
。 arrarr
-
NamedList 以包含兩個元素的陣列的形式呈現。
輸入為
NamedList("a"=1, "bar"="foo", null=3, null=null)
,輸出將會是[["a",1], ["bar","foo"], [null,3], [null,null]]
。 arrmap
-
NamedList 以 JSON 物件的陣列形式呈現。
輸入為
NamedList("a"=1, "bar"="foo", null=3, null=null)
,輸出將會是[{"a":1}, {"b":2}, 3, null]
。 arrntv
-
NamedList 以 Name Type Value JSON 物件的陣列形式呈現。
輸入為
NamedList("a"=1, "bar"="foo", null=3, null=null)
,輸出將會是[{"name":"a","type":"int","value":1}, {"name":"bar","type":"str","value":"foo"}, {"name":null,"type":"int","value":3}, {"name":null,"type":"null","value":null}]
。
標準 XML 回應寫入器
XML 回應寫入器是目前 Solr 中包含的最通用且可重複使用的回應寫入器。它是關於 Solr 查詢回應的大多數討論和文件中使用的格式。
請注意,XSLT 回應寫入器可以用來將此寫入器產生的 XML 轉換為其他詞彙或文字格式。
XML 回應寫入器的行為可以透過以下查詢參數來驅動。
version
-
選用
預設值:
2.2
version
參數決定回應中使用的 XML 協定。強烈建議客戶端總是指定協定版本,以確保他們收到的回應格式不會在 Solr 伺服器升級並引入新的預設格式時意外變更。目前唯一支援的版本值為
2.2
。responseHeader
的格式已變更為使用與回應其餘部分相同的<lst>
結構。預設值為最新支援的版本。
stylesheet
-
選用
預設值:無
stylesheet
參數可以用來指示 Solr 在它返回的 XML 回應中包含<?xml-stylesheet type="text/xsl" href="…"?>
宣告。預設行為是不返回任何樣式表宣告。
不建議使用
stylesheet
參數,因為目前沒有方法可以指定外部樣式表,並且 Solr 發行版中沒有提供任何樣式表。這是一個舊有的參數,在未來的版本中可能會進一步開發。 indent
-
選用
預設值:無
如果使用
indent
參數,且具有非空白的值,則 Solr 將會嘗試縮排其 XML 回應,使其更易於人類閱讀。預設行為是不縮排。
XSLT 回應寫入器
XSLT 回應寫入器將 XML 樣式表應用於輸出。它可以用於諸如格式化 RSS feed 結果之類的任務。
XSLT 回應寫入器接受一個參數
tr
-
選用
預設值:無
識別要使用的 XML 轉換。必須在 Solr 的
conf/xslt
目錄中找到轉換。回應的 Content-Type 是根據 XSLT 轉換中的
<xsl:output>
語句設定的,例如:<xsl:output media-type="text/html"/>
XSLT 設定
以下範例來自 Solr 發行版中的 sample_techproducts_configs
configset,展示如何設定 XSLT 回應寫入器。
<!--
Changes to XSLT transforms are taken into account
every xsltCacheLifetimeSeconds at most.
-->
<queryResponseWriter name="xslt"
class="solr.scripting.xslt.XSLTResponseWriter">
<int name="xsltCacheLifetimeSeconds">5</int>
</queryResponseWriter>
xsltCacheLifetimeSeconds
的值為 5 對於開發來說是不錯的,可以快速查看 XSLT 的變更。對於生產環境,您可能需要更高的值。
XSLT 寫入器範例
https://127.0.0.1:8983/solr/techproducts/select?q=ipod&fl=id,cat,name,popularity,price,score&wt=xslt&tr=example_rss.xsl
將結果轉換為 RSS feed
<rss version="2.0">
<channel>
<title>Example Solr RSS 2.0 Feed</title>
<link>https://127.0.0.1:8983/solr</link>
<description>
This has been formatted by the sample "example_rss.xsl" transform - use your own XSLT to get a nicer RSS feed.
</description>
<language>en-us</language>
<docs>https://127.0.0.1:8983/solr</docs>
<item>
<title>iPod & iPod Mini USB 2.0 Cable</title>
<link>
https://127.0.0.1:8983/solr/select?q=id:IW-02
</link>
<description/>
<pubDate/>
<guid>
https://127.0.0.1:8983/solr/select?q=id:IW-02
</guid>
</item>
sample_techproducts_configs
還包括 example.xsl
,它會產生一個簡單的 HTML 頁面,以及 example_atom.xsl
,它會以 Atom 格式輸出。
updateXml.xsl
可以用來將標準 Solr XML 輸出轉換為 Solr XML 新增文件格式!事實上,您可以透過以下方式往返您的資料
curl -o docs_formatted_as_solr_add.xml "https://127.0.0.1:8983/solr/techproducts/select?q=ipod&fl=id,cat,name,popularity,price,score&wt=xslt&tr=updateXml.xsl"
curl -X POST -H "Content-Type: text/xml" -d @docs_formatted_as_solr_add.xml "https://127.0.0.1:8983/solr/techproducts/update?commitWithin=1000&overwrite=true"
最後,luke.xsl
轉換示範了您可以應用非常複雜的轉換:https://127.0.0.1:8983/solr/techproducts/admin/luke?wt=xslt&tr=luke.xsl
二進制回應寫入器
這是 Solr 用於節點間通訊以及用戶端-伺服器通訊的自訂二進制格式。SolrJ 使用此格式作為索引和查詢的預設格式。有關更多詳細資訊,請參閱用戶端 API。
GeoJSON 回應寫入器
以 GeoJSON 格式返回 Solr 結果,並加入 Solr 特定的 JSON。要使用此功能,請將 wt=geojson
和 geojson.field
設定為空間 Solr 欄位的名稱。並非所有空間欄位類型都受支援,如果您使用不受支援的欄位,則會收到錯誤。
Python 回應寫入器
Solr 有一個可選的 Python 回應格式,它以以下方式擴展了其 JSON 輸出,以允許 Python 解譯器安全地評估回應
-
true 和 false 變更為 True 和 False
-
在需要時使用 Python Unicode 字串
-
ASCII 輸出(帶有 Unicode 跳脫字元)用於減少錯誤的互通性
-
換行符號會被跳脫
-
null 變更為 None
PHP 回應寫入器和 PHP 序列化回應寫入器
Solr 有一種 PHP 回應格式,可輸出一個陣列(以 PHP 程式碼的形式),可以進行評估。將 wt
參數設定為 php
會調用 PHP 回應寫入器。
使用範例
$code = file_get_contents('https://127.0.0.1:8983/solr/techproducts/select?q=iPod&wt=php');
eval("$result = " . $code . ";");
print_r($result);
Solr 還包括一個 PHP 序列化回應寫入器,該寫入器將輸出格式化為序列化陣列。將 wt
參數設定為 phps
會調用 PHP 序列化回應寫入器。
使用範例
$serializedResult = file_get_contents('https://127.0.0.1:8983/solr/techproducts/select?q=iPod&wt=phps');
$result = unserialize($serializedResult);
print_r($result);
Ruby 回應寫入器
Solr 有一個可選的 Ruby 回應格式,它以以下方式擴展了其 JSON 輸出,以允許 Ruby 解譯器安全地評估回應
-
Ruby 的單引號字串用於防止可能的字串漏洞。
-
\ 和 ' 是唯二會被跳脫的字元。
-
不使用 Unicode 跳脫字元。資料以原始 UTF-8 寫入。
-
nil 用於 null。
-
=> 用作 map 中的鍵/值分隔符號。
這是一個簡單的範例,說明如何使用 Ruby 回應格式查詢 Solr
require 'net/http'
h = Net::HTTP.new('localhost', 8983)
hresp, data = h.get('/solr/techproducts/select?q=iPod&wt=ruby', nil)
rsp = eval(data)
puts 'number of matches = ' + rsp['response']['numFound'].to_s
#print out the name field for each returned document
rsp['response']['docs'].each { |doc| puts 'name field = ' + doc['name'\] }
CSV 回應寫入器
CSV 回應寫入器以逗號分隔值 (CSV) 格式返回文件清單。通常包含在回應中的其他資訊,例如 facet 資訊,則會被排除。
CSV 參數
這些參數指定將返回的 CSV 格式。您可以接受預設值或指定您自己的值。
參數 | 預設值 |
---|---|
csv.encapsulator |
|
csv.escape |
無 |
csv.separator |
|
csv.header |
預設為 |
csv.newline |
|
csv.null |
預設為零長度字串。當文件沒有特定欄位的值時,請使用此參數。 |
多值欄位 CSV 參數
這些參數指定如何編碼多值欄位。可以使用 f.<fieldname>.csv.separator=|
來進行每個欄位的覆寫值。
參數 | 預設值 |
---|---|
csv.mv.encapsulator |
無 |
csv.mv.escape |
|
csv.mv.separator |
預設為 |
CSV 寫入器範例
https://127.0.0.1:8983/solr/techproducts/select?q=ipod&fl=id,cat,name,popularity,price,score&wt=csv
返回
id,cat,name,popularity,price,score
IW-02,"electronics,connector",iPod & iPod Mini USB 2.0 Cable,1,11.5,0.98867977
F8V7067-APL-KIT,"electronics,connector",Belkin Mobile Power Cord for iPod w/ Dock,1,19.95,0.6523595
MA147LL/A,"electronics,music",Apple 60 GB iPod with Video Playback Black,10,399.0,0.2446348
CBOR 回應寫入器
Solr 支援 CBOR 回應格式,該格式更緊湊且快速。使用 wt=cbor
參數以 CBOR 格式取得回應。
如果您的用戶端不支援 CBOR 的 STRINGREF 功能,請使用 wt=cbor&string_ref=false
Python 程式範例
將以下程式儲存為 cbor_query.py
import cbor2
import json
import requests
// replace 'coll1' with your own collection name. And use appropriate query params
url = "https://127.0.0.1:8983/solr/coll1/select?q=*:*&wt=cbor"
# Make the HTTP request
response = requests.get(url, headers={"Accept": "application/cbor"})
# Check the response status
if response.status_code == requests.codes.ok:
# Decode the CBOR response payload
cbor_data = response.content
json_data = cbor2.loads(cbor_data)
# Dump the JSON data to a file
with open("response.json", "w") as file:
json.dump(json_data, file, indent=4)
print("CBOR response payload dumped to response.json")
else:
print("HTTP request failed with status code:", response.status_code)
Smile 回應寫入器
Smile 格式是一種與 JSON 相容的二進制格式,在此處詳細說明:https://en.wikipedia.org/wiki/Smile_(data_interchange_format)
XLSX 回應寫入器
使用此選項可取得 .xlsx (Microsoft Excel) 格式的試算表回應。它接受 colwidth.<field-name>
和 colname.<field-name>
形式的參數,這些參數可協助您自訂欄寬和欄名。
此回應寫入器已新增為擷取程式庫的一部分,並且只有在伺服器類別路徑中存在擷取模組時才會運作。使用 lib
指令定義類別路徑是不夠的。相反地,您需要手動將必要的 .jar 複製到 Solr Webapp 的 lib
目錄。您可以從您的 $SOLR_INSTALL
目錄執行這些命令
cp modules/extraction/lib/*.jar server/solr-webapp/webapp/WEB-INF/lib/
將程式庫放置到位後,您可以將 wt=xlsx
新增至您的請求,結果將會以 XLSX 工作表的形式返回。