Elasticsearch 自分用メモ

  • 10
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

初めてElasticsearchを使ってみるので、触りながらメモします。

用語整理

http://code46.hatenablog.com/entry/2014/01/21/115620

まずは用語から。MySQLと対応させるとこんな感じみたい。

MySQL Elasticsearch
database index
table type
record document

マッピング: リレーショナルDBでいうところのテーブル定義

マッピングの作成

https://medium.com/hello-elasticsearch/elasticsearch-9a8743746467#.ovekuk8k3

$ curl -XPUT 'localhost:9200/<INDEX_NAME>' -d '
{
    "mappings" : {
      "<TYPE_NAME>" : {
        "properties" : {
          "author" : {
            "type" : "string"
          },
          "contents" : {
            "type" : "string",
            "analyzer": "japanese‎"
          },
          "enabled" : {
            "type" : "boolean"
          },
          "pub_date" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "read_ratio" : {
            "type" : "double"
          },
          "reads" : {
            "type" : "long"
          },
          "subtitle" : {
            "type" : "string",
            "analyzer": "japanese‎"
          },
          "title" : {
            "type" : "string",
            "analyzer": "japanese‎"
          },
          "views" : {
            "type" : "long"
          }
        }
      }
    }
  }
}'

定義したJSONファイル(mapping.json)から作成する場合

$ curl -XPOST 192.168.33.10:9200/<INDEX_NAME> -d @mapping.json

mapping.json の中身
tokenizer に ngram を指定

{
  "settings": {
    "analysis": {
      "analyzer": {
        "ngram_analyzer": {
          "tokenizer": "ngram_tokenizer"
        }
      },
      "tokenizer": {
        "ngram_tokenizer": {
          "type": "nGram",
          "min_gram": "2",
          "max_gram": "3",
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "items": {
      "properties": {
        "item_seq": {
          "type": "string"
        },
        "item_name": {
          "type": "string",
          "analyzer": "ngram_analyzer"
        },
        "group_seq": {
          "type": "string"
        }
      }
    }
  }
}

インデックス一覧の取得

$ curl -XGET 'localhost:9200/_aliases?pretty'

インデックスの削除

$ curl -X DELETE 'localhost:9200/<INDEX_NAME>'

プラグインの一覧

$ $ curl -X GET 'http://192.168.33.10:9200/_nodes/plugins?pretty'
{
  "cluster_name" : "elasticsearch",
  "nodes" : {
    "42fIIy3lQaGDGbnWL2Cydg" : {
      "name" : "Gwen Stacy",
      "transport_address" : "192.168.33.10:9300",
      "host" : "192.168.33.10",
      "ip" : "192.168.33.10",
      "version" : "2.1.1",
      "build" : "40e2c53",
      "http_address" : "192.168.33.10:9200",
      "plugins" : [ {
        "name" : "analysis-kuromoji",
        "version" : "2.1.1",
        "description" : "The Japanese (kuromoji) Analysis plugin integrates Lucene kuromoji analysis module into elasticsearch.",
        "jvm" : true,
        "classname" : "org.elasticsearch.plugin.analysis.kuromoji.AnalysisKuromojiPlugin",
        "isolated" : true,
        "site" : false
      } ]
    }
  }
}

検索

curl -XGET 'http://192.168.33.10:9200/<INDEX_NAME>/<TYPE_NAME>/_search?pretty=true' -d '
{
  "query" : {
    "simple_query_string" : {
      "query": "ほげ",
      "fields": ["_all"],
      "default_operator": "and"
    }
  }
}
'

一括登録 (PHP)

PHPからbulk load する方法

https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_indexing_documents.html

AWS の認証周り (PHP)

http://dev.classmethod.jp/cloud/aws/amazon-es-iam-based-access-control/

IAM使った時、elasticsearch のライブラリとどう組み合わせるのか分からん。

と思ったらこんなの発見。

Signing an Amazon Elasticsearch Service Search Request — AWS SDK for PHP documentation

AWS の認証周り(Python)

AWS ElasticSearch service · Issue #280 · elastic/elasticsearch-py

このへんで議論がされて、実装された模様。

Python Elasticsearch Client — Elasticsearch 2.2.0 documentation

こんな感じで使えるよって書いてあった。

from elasticsearch import Elasticsearch, RequestsHttpConnection
from requests_aws4auth import AWS4Auth

host = 'YOURHOST.us-east-1.es.amazonaws.com'
awsauth = AWS4Auth(YOUR_ACCESS_KEY, YOUR_SECRET_KEY, REGION, 'es')

es = Elasticsearch(
    hosts=[{'host': host, 'port': 443}],
    http_auth=awsauth,
    use_ssl=True,
    verify_certs=True,
    connection_class=RequestsHttpConnection
)
print(es.info())

AWS の認証周り(番外編)

Proxyがあった。
https://github.com/coreos/aws-auth-proxy