基本的な Unix コマンドを利用した、Solr からの効率的な情報の取得方法

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 で応用可能だとおもいますので、是非いろいろ試してみてください。