pub:2015.9.2/upd:2016.9.8

【スピード入門】elasticsearch

入門した時に残したメモ

elasticsearch Reference 1.7(オフィシャルドキュメント)を参考にしてまとめた。

  • https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

elasticsearchとは?

Treasuredataのあれ。ggrks。

最低限の基本概念

elasticsearchは、NRT(Near Real Time)で登録されたファイルの検索を実現するプラットフォームである。このようなプラットフォームは全文検索エンジンと呼ばれており、elasticsearchの他にApacheのSolerやLuceneなどが知られている。

基本的な構成要素

入門の前に脳にインストールしておくべき基本概念をまとめた。イミフな単語があれば概要を確認しておくこと。

  • クラスタ(Cluster)
  • ノード(Node)
  • インデックス(Index)
  • タイプ(Type)
  • ドキュメント(Document)
  • マッピング(Mapping)
  • アナライザ(Analyzer)
  • シャード(Shard)

クラスタ(Cluster)

ノードの集合のこと。リソースの単位として使われる。

ノード(Node)

演算実行主体の単位。

インデックス(Index)

特定の特徴をもったドキュメントの集合。RDBのテーブルに近い概念。

タイプ(Type)

ドキュメントの区分。

elasticsearcではRDBのように「ユーザテーブル」「アイテムテーブル」のような区分を行わず、1つのインデックスに関係する全てのドキュメントを登録する。

例えば、ドキュメントがユーザであるのか、アイテムであるのかはタイプで区别する。

ドキュメント(Document)

最小の情報単位。RDBのレコードに近い概念。

インデックスにドキュメントを登録するタスクのことを「インデックスする」と呼ぶ。

マッピング(Mapping)

ドキュメント内の各属性に対して、型、制約などに基づいて、どのアナライザを適用するかの設定適用を行うこと。

インデックスやタイプを単位として実施する。ある程度は自動的に行われるが、任意の設定をすることもできる。

アナライザ(Analyzer)

インデックスする前にドキュメントの字句解析を行うモジュールのこと。

アナライザをマッピング時にドキュメントの各属性に対して明示的な指定することで、任意の解析内容を設定することができる。

  • アナライザは、トークナイザとトークンフィルタから構成される。
  • トークナイザはngramや形態素解析などの要領で文字列を分割する。
  • トークンフィルタは大文字を小文字に変換するなどの諸々の処理を担当する。

適切な設計を行うためにはテキストマイニングの基本知識が必要。

日本語の形態素解析

日本語形態素解析プラグインとしてkuromojiがある。

kuromojiプラグインをアナライザに設定すると日本語を含むドキュメントのインデックス時に日本語に対応した形態素解析が行われる。

シャード(Shard)

インデックスを保存する論理的な場所のこと。

HWの性能制約によるレスポンスの低下に分散処理で対応する目的で、複数のノードでインデックスを分割して保持することもできる。

プライマリシャード(Primary Shard)

インデックスに登録されたドキュメントをメインで保管する論理的な場所のこと。

レプリカシャード(Replica Shard)

プライマリシャードのコピーのこと。

プライマリシャードとは別のノードに存在し待機系として働く。

練習用の環境の準備

筆者はローカル(OSX)で練習したかったので、vagrantでcentOS6.5の仮想環境を準備した。

kibanaとの連携によるデータビジュアライゼーションを試したい人は、GUIが使える環境を準備すると楽かもしれない。

インストール

簡単に済ませたいので。yumでインストールした。

キーのダウンロード。

$ rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

リポジトリの追加。

$ vi /etc/yum.repos.d/elasticsearch.repo
---
[elasticsearch-1.7]
name=Elasticsearch repository for 1.7.x packages
baseurl=http://packages.elastic.co/elasticsearch/1.7/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

yumでインストール。

$ yum install elasticsearch

起動。

$ /etc/init.d/elasticsearch start

クラスタの操作

クラスタの一覧を確認。

$ curl 'localhost:9200/_cat/health?v'

“green” と表示されればインストールは成功し、クラスタが正常に稼働している。

Tips:REST APIs によるクエリ

elasticsearchでは、ドキュメントなどの基本要素をRESTによって操作する。

RESTに馴染みがない人、RDBでSQLしかやったことがない人は若干戸惑うかもしれない。じきなれる。

インデックスの操作

インデックスの作成

インデックス:customerを作成。

$ curl -XPUT 'localhost:9200/customer?pretty'

インデックスの一覧

$ curl 'localhost:9200/_cat/indices?v'

インデックスの削除

インデックス:customerを削除。

$ curl -XDELETE 'localhost:9200/customer?pretty'

ドキュメントの操作

ドキュメントの登録

インデックス:customerに、タイプ:externalで、id:1、name: John Doeのドキュメントを登録する。

$ curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
   "name": "John Doe"
}'

バルク登録

$ curl -XPOST 'localhost:9200/customer/external/_bulk?pretty' -d '
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
'

ドキュメント検索

インデックス:customerから、タイプ:externalで、id:1のドキュメントを表示する。

$ curl -XGET 'localhost:9200/customer/external/1?pretty'

一覧表示

インデックス:bankの全てのドキュメントを表示。

$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match_all": {} }
}'

検索して表示

インデックス:bankの一部のドキュメントを表示。

$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "query": { "match_all": {} },
  "from": 10,
  "size": 10
}'

集計して表示

インデックス:bankのドキュメントを集計して表示。

$ curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state"
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}'

ドキュメントの更新

インデックス:customerから、タイプ:externalで、id:1のドキュメントを上書き。

$ curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
  "name": "John Doe"
}'

id:1を指定しない場合は、インクリメントで自動的にidが付番される。

ドキュメントの削除

id:2であるものを削除。

$ curl -XDELETE 'localhost:9200/customer/external/2?pretty'

nameがJohnであるものを削除。

$ curl -XDELETE 'localhost:9200/customer/external/_query?pretty' -d '
{
  "query": { "match": { "name": "John" } }
}'

マッピングの操作

マッピングの確認

インデックス:bankのマッピング設定を確認。

$ curl 'localhost:9200/bank/_mapping?pretty'

統計値の確認

Term Vectorsの取得

インデックス:twitter, タイプ:statusの id:763520073856274432 の Term Vectorsを取得。

$ curl -XGET 'localhost:9200/twetter/status/763520073856274432/_termvector?pretty' -d'
  {
      "fields" : ["text"],
      "offsets" : true,
      "positions" : true,
      "term_statistics" : true,
      "field_statistics" : true
  }'

任意の文章に対するVectorsも取得できる。

$ curl -XGET 'localhost:9200/twetter/status/_termvector?pretty' -d' {
    "doc" : {
      "text" : "艦これ楽しいお。あ、ぽこたんインしたお!"
    },
    "fields" : ["text"],
    "per_field_analyzer" : {
       "fullname": "kuromoji_analyzer"
    },
    "offsets" : true,
    "positions" : true,
    "term_statistics" : true,
    "field_statistics" : true
  }'

結果の読み方

これで、TF-IDFも取れる。やったね。

  • doc_freq : 同インデックス内の同単語を含むドキュメントの出現数
  • ttf : 同インデックス内の当該単語の出現数
  • term_freq : 同エントリー内の同単語の出現数
  • tokens : 同エントリー内の同単語の出現位置

プラグインのインストール

defaultでインストールしていれば、$ES_HOME (/usr/share/elasticsearch/) 以下にあるbin/pluginコマンドでインストールする。

以下、Shinsuke Sugaya氏のelasticsearch-analysis-kuromoji-neologdのインストール例。

/usr/share/elasticsearch/bin/plugin install org.codelibs/elasticsearch-analysis-kuromoji-neologd/2.4.0

形態素解析用辞書とシノニム解析用辞書

標準の置き場は/etc/elasticsearch
リロードしないと使われないので注意

辞書ファイルの書き方だって?
(´ω`)もう書くの疲れた。続きはggrか公式ドキュ見ててよな(´ω`)

REFERENCE

Leave a Reply

Your email address will not be published.