レスポンスライター
JSONレスポンスライター
デフォルトのSolrレスポンスライターはJsonResponseWriter
で、RFC 4627で指定されている軽量データ交換形式であるJavaScript Object Notation(JSON)で出力をフォーマットします。デフォルトのレスポンスライターは、次の場合に使用されます。
-
リクエストで
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
ですが、これは "techproducts"設定セットのこの例のように、solrconfig.xml
でオーバーライドできます。
<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>
JSONPでJSON形式のレスポンスを使用して境界を越えてクエリを実行する場合、ブラウザが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オブジェクト(基本的にマップまたはハッシュ)をNamedListに使用すると、情報の一部が失われます。
NamedList("a"=1, "bar"="foo", null=3, null=null)
を入力すると、出力は{"a":1, "bar":"foo", "":3, "":null}
になります。 arrarr
-
NamedListは、2つの要素を持つ配列の配列として表されます。
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は、名前、タイプ、値の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-stylesheet type="text/xsl" href="…"?>
宣言を返すXMLレスポンスに含めるように指示できます。デフォルトの動作では、スタイルシート宣言は返されません。
現在、外部スタイルシートを指定する方法がなく、Solrディストリビューションにはスタイルシートが提供されていないため、
stylesheet
パラメータの使用はお勧めしません。これはレガシーパラメータであり、将来のリリースでさらに開発される可能性があります。 indent
-
オプション
デフォルト: なし
indent
パラメータが使用され、空白以外の値を持つ場合、SolrはXMLレスポンスをインデントして、人間が読みやすくしようとします。デフォルトの動作では、インデントされません。
XSLT レスポンスライター
XSLTレスポンスライターは、XMLスタイルシートを出力に適用します。RSSフィードの結果のフォーマットなどのタスクに使用できます。
このレスポンスライターは、スクリプティングモジュールの一部です。モジュールであるため、使用するには設定が必要です。
XSLTレスポンスライターは、1つのパラメータを受け入れます。
tr
-
オプション
デフォルト: なし
使用するXML変換を識別します。変換は、Solrの
conf/xslt
ディレクトリにある必要があります。レスポンスのContent-Typeは、XSLT変換の
<xsl:output>
ステートメントに従って設定されます。例:<xsl:output media-type="text/html"/>
XSLT 設定
Solrディストリビューションのsample_techproducts_configs
設定セットからの以下の例は、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フィードに変換します。
<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
には、単純なHTMLページを生成するexample.xsl
と、Atom形式で出力するexample_atom.xsl
も含まれています。
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 レスポンスライター
Solrの結果を、Solr固有のJSONで拡張されたGeoJSONで返します。これを使用するには、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のシングルクォート文字列が使用されます。
-
\と'は、エスケープされる唯一の2文字です。
-
Unicodeエスケープは使用されません。データは生のUTF-8として書き込まれます。
-
nullにはnilが使用されます。
-
=>は、マップのキーと値の区切り文字として使用されます。
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)形式で返します。ファセット情報など、通常レスポンスに含まれるその他の情報は除外されます。
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&str_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 Webアプリのlib
ディレクトリに手動でコピーする必要があります。$SOLR_INSTALL
ディレクトリから次のコマンドを実行できます。
cp modules/extraction/lib/*.jar server/solr-webapp/webapp/WEB-INF/lib/
ライブラリが配置されたら、リクエストにwt=xlsx
を追加すると、結果がXLSXシートとして返されます。