ども、cloudpackかっぱ@inokara)です。

はじめに

前回の記事で @johtani さんに default_operator についてコメント頂いて、default_operator は全く意識しておらず自分のニワカっぷりに辛くなったので default_operator を含め search api と simple_query_string にフォーカスして改めて復習することにしました。(筆者の体力の都合上、全てを本ポストに記載するのは辛いのでシリーズ化してちょっとずつ書いていきます…)

今回は生で curl を叩くのではなくて Marvel に同梱されている sense を使って叩いてみたいと思います(案の定 Sensu と間違えました)

参考

メモ

準備

Elasticsearch のインストールは割愛して Marvel のインストール。

cd /usr/share/elasticsearch
bin/plugin -i elasticsearch/marvel/latest

念のため、Elasticsearch を再起動。

sudo /etc/init.d/elasticsearch restart

Marvel へアクセス

Marvel とは?については @johtani さんのブログポストを御覧ください。

Marvel をセットアップしたらブラウザで http://${Elasticsearch_Host}:9200/_plugin/marvelにアクセスしましょう。以下のような、みんな大好き Kibana ページが表示されるかと思います。
Elasticsearch を Marvel の sense を利用して復習する (1)

一日見ていても飽きない位に色々な情報が出力されています。Marvel に関しての詳細は…

を御覧ください。

sense へのアクセス

sense へのアクセスは Marvel の右上の Dashboards から…
Elasticsearch を Marvel の sense を利用して復習する (2)

sense を選択します。何度か申し上げておりますが…Sensu ではありませんのでご注意下さい。
Elasticsearch を Marvel の sense を利用して復習する (3)

上記のようなページが表示されます。

インデックスを作成

インデックス作成は以下のようなクエリを左ペインに書きます.

POST /test_index-1
{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "type1" : {
            "_source" : { "enabled" : false },
            "properties" : {
                "field1" : { "type" : "string" },
                "field2" : { "type" : "string" },
                "field3" : { "type" : "string" }
            }
        }
    }
}

左ペインに記載したら右上の緑色の再生ボタンをクリックすると…
Elasticsearch を Marvel の sense を利用して復習する (4)

インデックスが正常に作成されたようです。

ドキュメントを登録してみましょう

上記で作成したインデックスにドキュメントを登録してみましょう。以下のようなクエリを書きます。

PUT /test_index-1/test/1
{
        "field1" : "川原 洋平",
        "field2" : "aho",
        "field3" : "hage"
}

Elasticsearch を Marvel の sense を利用して復習する (5)
登録すると以下のように右ペインに出力されます。

{
   "_index": "test_index-1",
   "_type": "test",
   "_id": "1",
   "_version": 1,
   "created": true
}

メモ(2)

search api を叩いてみる

先ほど登録したドキュメントを検索してみたいと思いますので以下のようなクエリを書いてみます。

GET /test_index-1/_search?pretty
{
  "fields": [ "field1","field2","field3"],
  "query" : {
    "simple_query_string" : {
      "fields": ["field1"],
      "query": "田中 洋平"
    }
  }
}

以下のように出力されます。
Elasticsearch を Marvel の sense を利用して復習する (6)

あれっ、結果が 2 件だ…「田中 洋平」は一件のはずなのに…ということで実際の出力結果は以下のとおりです。

{
   "took": 2,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 0.8226396,
      "hits": [
         {
            "_index": "test_index-1",
            "_type": "test",
            "_id": "2",
            "_score": 0.8226396,
            "fields": {
               "field1": [
                  "田中 洋平"
               ],
               "field3": [
                  "hage"
               ],
               "field2": [
                  "aho"
               ]
            }
         },
         {
            "_index": "test_index-1",
            "_type": "test",
            "_id": "1",
            "_score": 0.10741998,
            "fields": {
               "field1": [
                  "川原 洋平"
               ],
               "field3": [
                  "hage"
               ],
               "field2": [
                  "aho"
               ]
            }
         }
      ]
   }
}

「川原 洋平」もヒットしていますね…。はい、前回の記事でコメント頂いていた default_operator のデフォルト値 or の挙動のようです。

efault_operator を and にしてみる

"default_operator": "and" オプションを付けてクエリを投げてみます。

GET /test_index-1/_search?pretty
{
  "fields": [ "field1","field2","field3"],
  "query" : {
    "simple_query_string" : {
      "fields": ["field1"],
      "query": "田中 洋平",
      "default_operator": "and"
    }
  }
}

以下のように期待した通りの結果が出力されました。
<Elasticsearch を Marvel の sense を利用して復習する (7)

おおっ

ということで…

search api の基本について実際にクエリを投げながら試してみました。ちゃんと動かしながらだとイメージもつかみやすいですし、何よりも sense はクエリのシンタックスチェックもやってくれるのでクエリを実行する前の修正や確認もお手軽でした(JSON フォーマットのシンタックスチェックにも使えるかも)。

引続き、search api を弄っていければと思います。

最後になりますが、全国の「田中洋平」さん、「川原洋平」さん、例に使ってしまい申し訳ございませんでした。

元記事はこちらです。
Elasticsearch の search api と simple_query_string を sense で復習するメモ(1)