[Solr] 検索結果をCBORで出力する

Solr 9.3 から Response Writer で CBOR がサポートされました。
CBOR は MessagePack の後継とも言われるオブジェクト・シリアライズ・フォーマットです。データモデルは JSON がベースになっており、シンプルかつコンパクトにデータのやり取りができます。

Solr の検索結果を CBOR で出力するには、パラメータで wt=cbor を指定するだけです。
Solr のチュートリアル用の techproducts データを対象に、同じ検索結果を JSON で出力した場合とでファイルサイズの違いを比べてみます。

$ curl -s 'http://localhost:8983/solr/techproducts/select?indent=true&q.op=OR&q=*%3A*&wt=cbor' --output result_cbor
$ curl -s 'http://localhost:8983/solr/techproducts/select?indent=true&q.op=OR&q=*%3A*&wt=cbor' --output result_cbor
$ ls -l result*
-rw-r--r-- 1 splout splout 2772 10月 28 20:13 result_cbor
-rw-r--r-- 1 splout splout 5166 10月 28 20:13 result_json

CBOR は JSON に比べると半分近くのサイズになっています。

cbor2 モジュールを使って CBOR のバイナリファイルを python で読み込んでみます。

$ python3
>>> import cbor2
>>> f = open('result_cbor', 'rb')
>>> dic = cbor2.loads(f.read())
>>> dic['responseHeader']
{'zkConnected': True, 'status': 0, 'QTime': 12, 'params': {'q': '*:*', 'indent': 'true', 'q.op': 'OR', 'wt': 'cbor'}}
>>> dic['response']['numFound']
52
>>> dic['response']['docs'][0]
{'id': '0812521390', 'cat': ['book'], 'name': 'The Black Company', 'price': 6.989999771118164, 'price_c': '6.99,USD', 'inStock': False, 'author': 'Glen Cook', 'author_s': 'Glen Cook', 'series_t': 'The Chronicles of The Black Company', 'sequence_i': 1, 'genre_s': 'fantasy', '_version_': 1780827206570737664, 'price_c____l_ns': 699, 'name_exact': 'The Black Company'}

cbor2.loads で dictionary として読み込まれ、JSON のとき同様に検索結果の情報を取り出せることが分かります。

コメント