レスポンスライター

レスポンスライターは、検索のフォーマットされたレスポンスを生成します。

Solrは、さまざまなレスポンスライターをサポートしており、クエリレスポンスが適切な言語またはアプリケーションによって解析されるようにします。

wtパラメータは、使用するレスポンスライターを選択します。以下のリストは、wtパラメータの最も一般的な設定を示しており、詳細について説明するセクションへのリンクが含まれています。

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}]になります。

json.wrf

json.wrf=function JSONレスポンスの周囲にラッパー関数を追加します。これは、JavaScriptコールバック関数を指定するための動的スクリプトタグを使用したAJAXで役立ちます。

標準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 &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には、単純な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=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のシングルクォート文字列が使用されます。

  • \と'は、エスケープされる唯一の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形式の出力は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&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)

プログラムの実行

  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 Webアプリのlibディレクトリに手動でコピーする必要があります。$SOLR_INSTALLディレクトリから次のコマンドを実行できます。

cp modules/extraction/lib/*.jar server/solr-webapp/webapp/WEB-INF/lib/

ライブラリが配置されたら、リクエストにwt=xlsxを追加すると、結果がXLSXシートとして返されます。