回應寫入器

回應寫入器會產生搜尋的格式化回應。

Solr 支援各種回應寫入器,以確保查詢回應可由適當的語言或應用程式剖析。

wt 參數會選擇要使用的回應寫入器。以下清單說明 wt 參數最常見的設定,並提供連結以深入討論這些設定。

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}]

json.wrf

json.wrf=function 在 JSON 回應周圍增加一個包裝函式,這在 AJAX 中使用動態 script 標籤來指定 JavaScript 回呼函式時很有用。

標準 XML 回應寫入器

XML 回應寫入器是目前 Solr 中包含的最通用且可重複使用的回應寫入器。它是關於 Solr 查詢回應的大多數討論和文件中使用的格式。

請注意,XSLT 回應寫入器可以用來將此寫入器產生的 XML 轉換為其他詞彙或文字格式。

XML 回應寫入器的行為可以透過以下查詢參數來驅動。

version

選用

預設值:2.2

version 參數決定回應中使用的 XML 協定。強烈建議客戶端總是指定協定版本,以確保他們收到的回應格式不會在 Solr 伺服器升級並引入新的預設格式時意外變更。

目前唯一支援的版本值為 2.2responseHeader 的格式已變更為使用與回應其餘部分相同的 <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 &amp; 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=geojsongeojson.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 格式的輸出與 Solr 的CSV 更新格式相容。

CSV 參數

這些參數指定將返回的 CSV 格式。您可以接受預設值或指定您自己的值。

參數 預設值

csv.encapsulator

"

csv.escape

csv.separator

,

csv.header

預設為 true。如果為 false,Solr 不會印出欄標頭。

csv.newline

\n

csv.null

預設為零長度字串。當文件沒有特定欄位的值時,請使用此參數。

多值欄位 CSV 參數

這些參數指定如何編碼多值欄位。可以使用 f.<fieldname>.csv.separator=| 來進行每個欄位的覆寫值。

參數 預設值

csv.mv.encapsulator

csv.mv.escape

\

csv.mv.separator

預設為 csv.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)

執行程式

  1. 安裝 Python

  2. 安裝相依性

    pip install requests cbor2
  3. 執行程式

    python3 cbor_query.py

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 工作表的形式返回。