Solr は、付属の管理画面面を利用することにより様々な情報を取得することが出来ます。
しかし、基本的な Unix コマンドを利用することにより、効率的に目的の情報を取得・加工することが出来ます。
ブラウザが利用出来ない環境などで有効です。
準備
今回利用するのは以下の Unix コマンドです。
echo
引数に渡した文字列を、標準出力に出力するのに利用します。
tr
echo
から渡された文字列の空白を改行に変更するのに利用します。
curl
Solr との通信をおこなう HTTP Client として利用します。今回は常に -s
オプションをつけ、レスポンスのみを表示するようにします。
jq
Solr Web API からのレスポンスを解析するのに利用します。 -r
オプションを利用することにより、値を囲う '"' を削除する使い方も利用します。
awk
標準入力から渡された改行区切りの数字データを加算するのに利用します。
xargs
-I
オプションを利用し、標準入力から渡された改行区切りのデータを、それぞれ xargs の引数コマンドにわたします。
検索結果を JSON で取得する
一番単純なパタンです。 URL のパラメタ部に wt=json
を付け、つねに JSON 形式でレスポンスを取得するようにします。
コマンド:
curl -s "http://localhost:60080/solr/sample_core1/select/?q=*:*&wt=json"
出力結果:
{"responseHeader":{"status":0,"QTime":2,"params":{"q":"*:*","wt":"json"}},"response":{"numFound":80884,"start":0,"docs":[{...
検索結果を整形した JSON で取得する
レスポンスを jq
の標準入力に渡すだけで、JSON を整形することが可能です。
コマンド:
curl -s "http://localhost:60080/solr/sample_core1/select/?q=*:*&wt=json" | jq .
出力結果:
{
"responseHeader": {
"status": 0,
"QTime": 1,
"params": {
"q": "*:*",
"wt": "json"
}
},
"response": {
"numFound": 80884,
"start": 0,
"docs": [
{
....
同様のことは URLのパラメタ部に indent=2
を追加する事によっても可能です。
しかし、今後はほとんどの場合 jq
を利用するので、 整形目的の indent
パラメタは今回は利用しません。
url field のみを取得する
Solr Document の Unique Key として利用している field を url
とします。
URLのパラメタ部に fl=url
を付け加えることにより、 Unique Key だけを取得できます。
コマンド:
curl -s "http://localhost:60080/solr/sample_core1/select/?q=*:*&fl=url&wt=json" | jq .
出力結果:
{
"responseHeader": {
"status": 0,
"QTime": 2,
"params": {
"wt": "json",
"fl": "url",
"q": "*:*"
}
},
"response": {
"numFound": 910,
"start": 0,
"docs": [
{
"url": "http://promo.mobile.yahoo.co.jp/yjapp/"
},
{
"url": "http://promotion.yahoo.co.jp/visadebit1602/"
},
{
"url": "http://travel.yahoo.co.jp/"
},
{
"url": "http://dir.yahoo.co.jp/"
},
{
"url": "http://id.yahoo.co.jp/"
},
{
"url": "http://kids.yahoo.co.jp/"
},
{
"url": "http://bbpromo.yahoo.co.jp/"
},
{
"url": "http://search.yahoo.co.jp/"
},
{
"url": "http://dic.yahoo.co.jp/"
},
{
"url": "http://map.yahoo.co.jp/"
}
]
}
}
url リストを取得する
jq
の引数を調整することにより、url のリストを取得することが出来ます。
jq
の引数は奥が深いので、詳しくは本家のマニュアルをご参照下さい。
コマンド:
curl -s "http://localhost:60080/solr/sample_core1/select/?q=*:*&fl=url&wt=json" | jq .response.docs[].url
出力結果:
"http://promo.mobile.yahoo.co.jp/yjapp/"
"http://promotion.yahoo.co.jp/visadebit1602/"
"http://travel.yahoo.co.jp/"
"http://dir.yahoo.co.jp/"
"http://id.yahoo.co.jp/"
"http://kids.yahoo.co.jp/"
"http://bbpromo.yahoo.co.jp/"
"http://search.yahoo.co.jp/"
"http://dic.yahoo.co.jp/"
"http://map.yahoo.co.jp/"
url を囲う '"' を除く
jq
に -r
オプションを付けることにより、URL を囲う '"' を取り除くことが出来ます。
コマンド:
curl -s "http://localhost:60080/solr/sample_core1/select/?q=*:*&fl=url&wt=json" | jq -r .response.docs[].url
出力結果:
http://promo.mobile.yahoo.co.jp/yjapp/
http://promotion.yahoo.co.jp/visadebit1602/
http://travel.yahoo.co.jp/
http://dir.yahoo.co.jp/
http://id.yahoo.co.jp/
http://kids.yahoo.co.jp/
http://bbpromo.yahoo.co.jp/
http://search.yahoo.co.jp/
http://dic.yahoo.co.jp/
http://map.yahoo.co.jp/
ドキュメント数を取得する
コマンド:
curl -s "http://localhost:60080/solr/sample_core1/select/?q=*:*&fl=url&wt=json" | jq -r .response.numFound
出力結果:
910
Solr Core の情報を取得する
Solr Web API の cores API を使うことにより、Solr に配置してある全ての Solr Core の情報が取得できます。
コマンド:
curl -s "http://localhost:60080/solr/admin/cores?action=STATUS&wt=json" | jq .
出力結果:
{
"responseHeader": {
"status": 0,
"QTime": 33
},
"status": {
"sample_core1": {
"name": "sample_core1",
"instanceDir": "/path/to/sample_core1/",
"dataDir": "/path/to/sample_core1/data/",
"startTime": "2015-09-24T05:21:14.755Z",
"uptime": 13328994006,
"index": {
"numDocs": 3000,
"maxDoc": 3000,
...
Solr Core の配置されているディレクトリを取得する
jq
の引数を調整することにより、特定の Solr Core の物理配置を取得できます。
コマンド:
curl -s "http://localhost:60080/solr/admin/cores?action=STATUS&wt=json" | jq -r .status.sample_core1.instanceDir
出力結果:
/path/to/sample_core1/
ドキュメント数を取得する その2
以下の方法でも Solr Core のドキュメント数を取得できます。
コマンド:
curl -s "http://localhost:60080/solr/admin/cores?action=STATUS&wt=json" | jq -r .status.sample_core1.index.numDocs
出力結果:
910
全 Solr Core の ドキュメント数の合計を取得する
awk
を利用することにより、全 Solr Core のドキュメント数の合計を取得可能です。
コマンド:
curl "http://localhost:60080/solr/admin/cores?action=STATUS&wt=json" -s | jq -r ".status | values[] | .index.numDocs" | awk '{a += $1}END{print a}'
Solr Core を複数指定して情報を取得する
cores API に core
パラメタで Solr Core を指定することにより、特定の Solr Core の情報を取得することが可能です。
少し複雑ですが、 echo
と tr
と xargs
を組み合わせることにより、1 liner で複数の Solr の情報を取得し、加工する事が可能です。
以下の例は、特定の Solr Core のドキュメント数の合計を取得している例です。
コマンド:
echo sample_core1 sample_core2 | tr " " "\n" | xargs -IXXX curl -s "http://localhost:60080/solr/admin/cores?action=STATUS&wt=json&core=XXX" | jq ".status | values[] | .index.numDocs" | awk '{a += $1}END{print a}'
出力結果:
まとめ
基本的な Unix コマンドを利用して Solr Web API から得られる情報を加工してみました。
Solr だけではなく、いろいろな API で応用可能だとおもいますので、是非いろいろ試してみてください。