yujiro's blog

「インターネット上で正しい答えを得る最善の方法は、質問することではない。間違った答えを投稿することだ」by ウォード・カニンガム。 辛辣なコメントお待ちしております。

Elasticsearch について

インストールから、よく使われるプラグインを入れて、使い方をざっくりとご紹介したいと思います。

環境

Ubuntu 16.04

Elasticsearch 2.4.6

インストール

$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

$ echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list

$ sudo apt-get update && sudo apt-get install elasticsearch

$ /usr/share/elasticsearch/bin/elasticsearch --version

Version: 2.4.6, Build: 5376dca/2017-07-18T12:17:44Z, JVM: 1.8.0_162

$ sudo update-rc.d elasticsearch defaults 95 10

$ sudo service elasticsearch start

基本的にはここまででOK。

別記事に書く予定ですが、Rails から別仮想マシンにあるElasticsearch を使いたいので、private ip でアクセスできるようにしておきました。

$ sudo vi /etc/elasticsearch/elasticsearch.yml

+ network.host: ["_site_", "_local_", "192.168.33.93"]

また、プロセスのアドレス空間をRAMのサイズ内に抑えるのが以下です。同じファイルに記述します。コメントアウトされているので外します。

- #bootstrap.memory_lock: true
+ bootstrap.memory_lock: true

次にElasticsearchが使用するメモリについてですが、ここではメモリ 1GB の仮想マシン上で動かすので、512mb ぐらいで設定しておきます。

$ sudo vi /etc/init.d/elasticsearch

ES_HEAP_SIZE=512m

Plugin インストール

kuromoji

日本語の全文検索をするときは大体これをいれればOK

$ sudo /usr/share/elasticsearch/bin/plugin install analysis-kuromoji

elasticsearch-head

Elasticsearch をGUIで管理できるようにするプラグイン。超おすすめ

$ sudo /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head

! install したら再起動が必要なり !

使い方

Pluign 一覧取得

$ curl -X GET 'http://[host]:9200/_nodes/plugins?pretty'

インデックス一覧取得

$ curl '[host]:9200/_cat/indices?v'

or

$ curl -XGET '[host]:9200/_aliases?pretty'

既存index の詳細を見る

$ curl '[host]:9200/[index_name]/?pretty'

インデックスを作成とともにタイプとドキュメントまで作成する

$ curl -XPUT '[host]:9200/blog/story/1' -d '{
    "title" : "Elasticsearch 特徴まとめ",
    "subtitle" : "Elasticsearch Features — 主にシステムを中心とした特徴まとめ","contents": "Elasticsearch とは?簡単に説明すると、クラウド向けに構築された、RESTful な APIを提供する分散型のサーチエンジンアプリケーション。オープンソースで提供されています。",
    "tags" : ["Elasticsearch", "Search-Engine"],
    "pub_date" : "2014-04-10T01:40:00",
    "author" : "Kunihiko Kido",
    "views" : 82,
    "reads": 60,
    "read_ratio": 0.73,
    "enabled": true
}'

=>

{"_index":"blog","_type":"story","_id":"1","_version":1,"_shards":{"total":2,"successful":1,"failed":0},"created":true}%

手動マッピング

既存のインデックスにデータが既にインデックスされている場合、/_mapping エンドポイントを使って、新しいフィールドタイプを追加することはできますが、更新はできません。

Elasticsearch マッピング – Hello! Elasticsearch. – Medium

index 削除

$ curl -XDELETE '[host]:9200/[index_name]'

json からindex 作成

以下を mapping.json として保存

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_kuromoji_analyzer": {
          "type": "custom",
          "tokenizer": "kuromoji_tokenizer"
        }
      }
    }
  },
  "mappings": {
    "story" : {
      "properties" : {
        "author" : {
          "type" : "string"
        },
        "contents" : {
          "type" : "string",
          "analyzer": "my_kuromoji_analyzer"
        },
        "enabled" : {
          "type" : "boolean"
        },
        "pub_date" : {
          "type" : "date",
          "format" : "dateOptionalTime"
        },
        "read_ratio" : {
          "type" : "double"
        },
        "reads" : {
          "type" : "long"
        },
        "subtitle" : {
          "type" : "string",
          "analyzer": "my_kuromoji_analyzer"
        },
        "title" : {
          "type" : "string",
          "analyzer": "my_kuromoji_analyzer"
        },
        "views" : {
          "type" : "long"
        }
      }
    }
  }
}

$ curl -XPUT '[host]:9200/blog' -d @mapping.json

Type の中身をみる

$ curl -XGET '[host]:9200/[index_name]/[type_name]/_search?pretty'

クエリメモ

ソート、Limit 等

$ curl -XGET '[host]:9200/[index_name]/[type_name]/_search?pretty' -d '
{
     "query" : {
         "match_all" : {}
     },
     "sort" : {
        "id" : {"order" : "desc"}
     },
     "size" : 1
 }'

検索( 単語単位)

$ curl -XGET '[host]:9200/[index_name]/[type_name]/_search?pretty' -d '
{
     "query" : {
         "match" : {
           "title" : {
             "query" : {
               "Sample"
             }
           }
         }
     },
     "sort" : {
        "id" : {"order" : "desc"}
     },
     "size" : 1
 }'

あいまい検索

$ curl -XGET '[host]:9200/[index_name]/[type_name]/_search?pretty' -d '
{
     "query" : {
       "bool" : {
          "must" : [{
              "wildcard" : {
                   "title" : "*test*"
                }
            }]
         }
     },
     "sort" : {
        "id" : {"order" : "desc"}
     },
     "size" : 1
 }'

一通り、クエリ投げたりして雰囲気つかんだら、上にあげた elasticsearch-head プラグインをつかってGUI上で操作することをおすすめします。

ブラウザで

http://[host]:9200/_plugin/head/

にアクセスしてみましょう。

Any Request タブにいって Query から Json を貼り付けて Request ボタン押すと結果が帰ってきます。こっちのほうが遥かに楽ですね。

f:id:bambookun:20180121153324p:plain

参考

Elasticsearch 自分用メモ

Elasticsearch マッピング

ElasticsearchでKuromoji Tokenizerを試す

analysis-kuromoji

Configuring Elasticsearch On Rails

elasticsearchのGUI「elasticsearch-head」がとても便利

ElasticsearchをUbuntu 14.04にインストールする