SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

Elasticsearchする

問題

Elastic Search 使ってみたいです。

どうやってインストールするの?どうやって使うの?

答え

docker で環境を作るのをよく見かけますが、rpmでもサクッとインストールできる。

java8 が必要

CentOS6でも1.8がちゃんと入ってくる。CentOS8でも同様だった。

yum install java

Elasticsearchインストール

公式rpmでインストールできる。複雑な依存関係も特にない様子。

yum install https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.0-x86_64.rpm

プラグイン追加。日本語の検索をするなら。

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

Elasticsearch設定

ローカルで使用するならそのまま起動してもよい。

別サーバーからアクセスするつもりなら以下のような設定の追加をするとよい。

vi /etc/elasticsearch/elasticsearch.yml
network.host: 0.0.0.0
http.port: 9200
transport.host: localhost
transport.tcp.port: 9300

こちらの設定ファイル /etc/elasticsearch/elasticsearch.yml 初期状態ではすべてコメントなので、該当箇所を書き換えるもよいし、末尾に追記でも大丈夫。

Elasticsearch起動

あっさり起動します。

service elasticsearch start

もしくは

systemctl start elasticsearch

Elasticsearchを使う

Elasticsearchと適当に会話する。

URL に ?pretty がついているが、人間にとって見やすく整形してくれるオプションなので、普段使うときは外してよい。

・Nodeの情報ください

$ curl -X GET 'http://localhost:9200/_nodes?pretty'
{
  "_nodes" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "cluster_name" : "elasticsearch",
  "nodes" : {
    "E9U91tXPSwqn4UdotIMo8Q" : {
      "name" : "juchumail-db",
      "transport_address" : "127.0.0.1:9300",
      "host" : "localhost",
      "ip" : "127.0.0.1",
      "version" : "7.6.0",
      "build_flavor" : "default",
      "build_type" : "rpm",
(以下略)

・レコード(document)を作る。

indexは自動的に作成されるそうなので、いきなり投入可能。

curlコマンドで、customer index に顧客データを投入。

$ curl -X POST http://localhost:9200/customer/_doc/ -H "Content-Type: application/json" -d '
{
    "name": "Gifu Taro",
    "birthday": "2000-01-01",
    "jikoshokai": "犬が好き。猫も好き。",
    "tags": ["red", "green", "blue"]
}
'

結果

{"_index":"customer","_type":"_doc","_id":"Ju2GanABDcj0ED5y7fdz","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

index作成のためか、1回目は一瞬待たされましたが、2回目以降はサクサク入ります。

$ curl -X POST http://localhost:9200/customer/_doc/ -H "Content-Type: application/json" -d '
{
    "name": "Nagoya Hanako",
    "birthday": "2000-02-02",
    "jikoshokai": "花が好き。草も好き。テストデータです。テストデータです。",
    "tags": ["red", "green", "blue"]
}
'
{"_index":"customer","_type":"_doc","_id":"J-2QanABDcj0ED5yQ_eb","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1}
$ curl -X POST http://localhost:9200/customer/_doc/ -H "Content-Type: application/json" -d '
{
    "name": "Tokai Jiro",
    "birthday": "2000-03-03",
    "jikoshokai": "エビが好き。カニも好き。テストデータです。",
    "tags": ["red", "green", "blue"]
}
'
{"_index":"customer","_type":"_doc","_id":"KO2QanABDcj0ED5yePfi","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":2,"_primary_term":1}

・検索する

クエリなし

curl -X GET http://localhost:9200/customer/_search -H "Content-Type: application/json"

キーワード「猫(%E7%8C%AB)」

$ curl -X GET http://localhost:9200/customer/_search?q=%E7%8C%AB

{"took":2,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":1,"relation":"eq"},"max_score":1.1040031,"hits":[{"_index":"customer","_type":"_doc","_id":"Ju2GanABDcj0ED5y7fdz","_score":1.1040031,"_source":
{
    "name": "Gifu Taro",
    "birthday": "2000-01-01",
    "jikoshokai": "犬が好き。猫も好き。",
    "tags": ["red", "green", "blue"]
}

ソート(誕生日の降順)

$ curl -X GET  http://localhost:9200/customer/_search?sort=birthday:desc
{"took":1,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":3,"relation":"eq"},"max_score":null,"hits":[{"_index":"customer","_type":"_doc","_id":"KO2QanABDcj0ED5yePfi","_score":null,"_source":
{
    "name": "Tokai Jiro",
    "birthday": "2000-03-03",
    "jikoshokai": "エビが好き。カニも好き。テストデータです。",
    "tags": ["red", "green", "blue"]
}
,"sort":[952041600000]},{"_index":"customer","_type":"_doc","_id":"J-2QanABDcj0ED5yQ_eb","_score":null,"_source":
{
    "name": "Nagoya Hanako",
    "birthday": "2000-02-02",
    "jikoshokai": "花が好き。草も好き。テストデータです。テストデータです。",
    "tags": ["red", "green", "blue"]
}
,"sort":[949449600000]},{"_index":"customer","_type":"_doc","_id":"Ju2GanABDcj0ED5y7fdz","_score":null,"_source":
{
    "name": "Gifu Taro",
    "birthday": "2000-01-01",
    "jikoshokai": "犬が好き。猫も好き。",
    "tags": ["red", "green", "blue"]
}

起動、データ投入、検索まで、とても簡単にできた。

データ全削除

テスト中にデータをリセットしたくなったら、以下できれいに消える。

$ curl -X DELETE  'http://localhost:9200/*'

特定のindexのみなど部分的に削除も可能。

$ curl -X DELETE  'http://localhost:9200/customer'

郵便番号データを投入してさらに動作を確認する

データがたくさん入ったCSVということで、日本郵便の郵便番号データを利用して。ちょっとしたスクリプトを書いて、Elasticsearchに投入しました。

match で検索をかけるとあいまい検索になり、だんだんGoogle検索っぽい動きになってきます。

キーワード「南北(\u5357\u5317)」で検索すると

レスポンスは即答で帰ってくるのですが、MySQLの LIKE ‘%南北%’ を期待していると期待を裏切られます。

北野南、上北南などがヒットします。

$ curl -X POST http://localhost:9200/postcode/_search?pretty -H "Content-Type: application/json" -d '{
  "query": {
    "match": {
      "cho": {
        "query":"\u5357\u5317"
      }
    }
  }
}'
{
  "took" : 13,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 8486,
      "relation" : "eq"
    },
    "max_score" : 7.3872533,
    "hits" : [
      {
        "_index" : "postcode",
        "_type" : "_doc",
        "_id" : "ITbhanABo_MoE6hcJ9bB",
        "_score" : 7.3872533,
        "_source" : {
          "jichitai" : "03201",
          "oldpostalcode" : "020  ",
          "postalcode" : "0200863",
          "ken_kana" : "イワテケン",
          "shi_kana" : "モリオカシ",
          "cho_kana" : "ミナミセンボク",
          "ken" : "岩手県",
          "shi" : "盛岡市",
          "cho" : "南仙北",
          "a" : "0",
          "b" : "0",
          "c" : "1",
          "d" : "0",
          "e" : "0",
          "f" : "0"
        }
      },
      {
        "_index" : "postcode",
        "_type" : "_doc",
        "_id" : "GTfhanABo_MoE6hc_iZB",
        "_score" : 7.3872533,
        "_source" : {
          "jichitai" : "11208",
          "oldpostalcode" : "359  ",
          "postalcode" : "3591156",
          "ken_kana" : "サイタマケン",
          "shi_kana" : "トコロザワシ",
          "cho_kana" : "キタノミナミ",
          "ken" : "埼玉県",
          "shi" : "所沢市",
          "cho" : "北野南",
          "a" : "0",
          "b" : "0",
          "c" : "1",
          "d" : "0",
          "e" : "0",
          "f" : "0"
        }
      },
      {
        "_index" : "postcode",
        "_type" : "_doc",
        "_id" : "2DbhanABo_MoE6hcIdOa",
        "_score" : 7.3872533,
        "_source" : {
          "jichitai" : "02408",
          "oldpostalcode" : "03924",
          "postalcode" : "0392405",
          "ken_kana" : "アオモリケン",
          "shi_kana" : "カミキタグントウホクマチ",
          "cho_kana" : "カミキタミナミ",
          "ken" : "青森県",
          "shi" : "上北郡東北町",
          "cho" : "上北南",
          "a" : "0",
          "b" : "0",
          "c" : "1",
          "d" : "0",
          "e" : "0",
          "f" : "0"
        }
      },
      {
        "_index" : "postcode",
        "_type" : "_doc",
        "_id" : "_zbhanABo_MoE6hcV-fP",
        "_score" : 7.3872533,
        "_source" : {
          "jichitai" : "04341",
          "oldpostalcode" : "98121",
          "postalcode" : "9812187",
          "ken_kana" : "ミヤギケン",
          "shi_kana" : "イググンマルモリマチ",
          "cho_kana" : "キタハラミナミ",
          "ken" : "宮城県",
          "shi" : "伊具郡丸森町",
          "cho" : "北原南",
          "a" : "0",
          "b" : "0",
          "c" : "0",
          "d" : "1",
          "e" : "0",
          "f" : "0"
        }
      },
      {
        "_index" : "postcode",
        "_type" : "_doc",
        "_id" : "9DfjanABo_MoE6hcJ5Q2",
        "_score" : 7.3872533,
        "_source" : {
          "jichitai" : "21201",
          "oldpostalcode" : "50125",
          "postalcode" : "5012516",
          "ken_kana" : "ギフケン",
          "shi_kana" : "ギフシ",
          "cho_kana" : "キタノミナミ",
          "ken" : "岐阜県",
          "shi" : "岐阜市",
          "cho" : "北野南",
          "a" : "0",
          "b" : "0",
          "c" : "0",
          "d" : "0",
          "e" : "0",
          "f" : "0"
        }
      },
      {
        "_index" : "postcode",
        "_type" : "_doc",
        "_id" : "ijfkanABo_MoE6hcLveI",
        "_score" : 7.3872533,
        "_source" : {
          "jichitai" : "27125",
          "oldpostalcode" : "559  ",
          "postalcode" : "5590034",
          "ken_kana" : "オオサカフ",
          "shi_kana" : "オオサカシスミノエク",
          "cho_kana" : "ナンコウキタ",
          "ken" : "大阪府",
          "shi" : "大阪市住之江区",
          "cho" : "南港北",
          "a" : "0",
          "b" : "0",
          "c" : "1",
          "d" : "0",
          "e" : "0",
          "f" : "0"
        }
      },
      {
        "_index" : "postcode",
        "_type" : "_doc",
        "_id" : "BzjkanABo_MoE6hcZw3x",
        "_score" : 7.3872533,
        "_source" : {
          "jichitai" : "28207",
          "oldpostalcode" : "664  ",
          "postalcode" : "6640887",
          "ken_kana" : "ヒョウゴケン",
          "shi_kana" : "イタミシ",
          "cho_kana" : "ミナミノキタ",
          "ken" : "兵庫県",
          "shi" : "伊丹市",
          "cho" : "南野北",
          "a" : "0",
          "b" : "0",
          "c" : "1",
          "d" : "0",
          "e" : "0",
          "f" : "0"
        }
      },
      {
        "_index" : "postcode",
        "_type" : "_doc",
        "_id" : "jTjkanABo_MoE6hc-UOC",
        "_score" : 7.3872533,
        "_source" : {
          "jichitai" : "35202",
          "oldpostalcode" : "75902",
          "postalcode" : "7590209",
          "ken_kana" : "ヤマグチケン",
          "shi_kana" : "ウベシ",
          "cho_kana" : "コウナンキタ",
          "ken" : "山口県",
          "shi" : "宇部市",
          "cho" : "厚南北",
          "a" : "0",
          "b" : "0",
          "c" : "1",
          "d" : "0",
          "e" : "0",
          "f" : "0"
        }
      },
      {
        "_index" : "postcode",
        "_type" : "_doc",
        "_id" : "wTbganABo_MoE6hc-8XC",
        "_score" : 6.609371,
        "_source" : {
          "jichitai" : "01631",
          "oldpostalcode" : "08001",
          "postalcode" : "0800306",
          "ken_kana" : "ホッカイドウ",
          "shi_kana" : "カトウグンオトフケチョウ",
          "cho_kana" : "キタスズランミナミ",
          "ken" : "北海道",
          "shi" : "河東郡音更町",
          "cho" : "北鈴蘭南",
          "a" : "0",
          "b" : "0",
          "c" : "1",
          "d" : "0",
          "e" : "0",
          "f" : "0"
        }
      },
      {
        "_index" : "postcode",
        "_type" : "_doc",
        "_id" : "DTbganABo_MoE6hc_MaL",
        "_score" : 6.609371,
        "_source" : {
          "jichitai" : "01631",
          "oldpostalcode" : "08001",
          "postalcode" : "0800311",
          "ken_kana" : "ホッカイドウ",
          "shi_kana" : "カトウグンオトフケチョウ",
          "cho_kana" : "ミナミスズランキタ",
          "ken" : "北海道",
          "shi" : "河東郡音更町",
          "cho" : "南鈴蘭北",
          "a" : "0",
          "b" : "0",
          "c" : "1",
          "d" : "0",
          "e" : "0",
          "f" : "0"
        }
      }
    ]
  }
}

このあたりの動作は、テーブル定義っぽい役目のマッピング(Mapping)によって変わる。アナライザーによって変わる。

マッピング

インデックスのmappingについて問い合わせると

$ curl -X GET http://localhost:9200/postcode/_mapping?pretty

以下のようになっている。こうなっていると上の「南北」検索のような結果になる。

(前略)
        "cho" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
(後略)

フィールドの型やアナライザなどを指定してデータを入れると結果が変わる。

以下だと1文字ずつバラされるのに対して

GET /customer/_analyze
{
    "field": "text",
    "text" : "昔々あるところにおじいさんとおばあさんがいました"
}

→ 昔, 々, あ, る, と, こ, ろ, に …

以下のように、アナライザーにkuromojiを指定すると、単語や文節で切ってくれる。

PUT kuromoji_sample
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "my_analyzer": {
            "tokenizer": "kuromoji_tokenizer",
            "filter": [
              "kuromoji_baseform"
            ]
          }
        }
      }
    }
  }
}
GET /kuromoji_sample/_analyze
{
"analyzer": "my_analyzer",
"text" : "昔々,あるところにおじいさんとおばあさんがいました。桃が流れてきました"
}

→ 昔, 々, ある, ところ, に, おじいさん, …

・集計する

GET /postalcode/_search
{
  "size": 0,
  "aggs": {
    "total_value_count": {
      "value_count": {
        "field": "ken.keyword"
      }
    }
  }
}
{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 10000,
      "relation" : "gte"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "total_value_count" : {
      "value" : 124395
    }
  }
}

郵便番号データは 124395件と出た。

・集計する2

GET /postalcode/_search
{
  "size": 0,
  "aggs": {
    "total_value_count": {
      "value_count": {
        "field": "postalcode.keyword"
      }
    },
    "group_by_ken": {
      "terms": {
        "field": "ken.keyword",
        "size":50
      },
      "aggs": {
        "count_ken_goto": {
          "value_count": {
            "field": "postalcode.keyword"
          }
        },
        "shi_ruiji": {
          "cardinality": {
            "field": "postalcode.keyword"
          }
        }
      }
    }
  }
}

県ごとの郵便番号の件数が出た。

{
  "took" : 102,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 10000,
      "relation" : "gte"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "total_value_count" : {
      "value" : 124395
    },
    "group_by_ken" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "北海道",
          "doc_count" : 8252,
          "count_ken_goto" : {
            "value" : 8252
          },
          "shi_ruiji" : {
            "value" : 8037
          }
        },
        {
          "key" : "愛知県",
          "doc_count" : 7713,
          "count_ken_goto" : {
            "value" : 7713
          },
          "shi_ruiji" : {
            "value" : 7231
          }
        },
        {
          "key" : "京都府",
          "doc_count" : 6660,
          "count_ken_goto" : {
            "value" : 6660
          },
          "shi_ruiji" : {
            "value" : 6456
          }
        },
        {
          "key" : "新潟県",
          "doc_count" : 5448,
          "count_ken_goto" : {
            "value" : 5448
          },
          "shi_ruiji" : {
            "value" : 5347
          }
        },
        {
          "key" : "兵庫県",
          "doc_count" : 5223,
          "count_ken_goto" : {
            "value" : 5223
          },
          "shi_ruiji" : {
            "value" : 5191
          }
        },
        {
          "key" : "東京都",
          "doc_count" : 3972,
          "count_ken_goto" : {
            "value" : 3972
          },
          "shi_ruiji" : {
            "value" : 3990
          }
        },
        {
          "key" : "福島県",
          "doc_count" : 3953,
          "count_ken_goto" : {
            "value" : 3953
          },
          "shi_ruiji" : {
            "value" : 3583
          }
        },
        {
          "key" : "大阪府",
          "doc_count" : 3849,
          "count_ken_goto" : {
            "value" : 3849
          },
          "shi_ruiji" : {
            "value" : 3818
          }
        },
        {
          "key" : "千葉県",
          "doc_count" : 3602,
          "count_ken_goto" : {
            "value" : 3602
          },
          "shi_ruiji" : {
            "value" : 3598
          }
        },
        {
          "key" : "宮城県",
          "doc_count" : 3391,
          "count_ken_goto" : {
            "value" : 3391
          },
          "shi_ruiji" : {
            "value" : 2843
          }
        },
        {
          "key" : "岐阜県",
          "doc_count" : 3372,
          "count_ken_goto" : {
            "value" : 3372
          },
          "shi_ruiji" : {
            "value" : 3369
          }
        },
        {
          "key" : "福岡県",
          "doc_count" : 3297,
          "count_ken_goto" : {
            "value" : 3297
          },
          "shi_ruiji" : {
            "value" : 3273
          }
        },
        {
          "key" : "富山県",
          "doc_count" : 3258,
          "count_ken_goto" : {
            "value" : 3258
          },
          "shi_ruiji" : {
            "value" : 2977
          }
        },
        {
          "key" : "埼玉県",
          "doc_count" : 2959,
          "count_ken_goto" : {
            "value" : 2959
          },
          "shi_ruiji" : {
            "value" : 2950
          }
        },
        {
          "key" : "静岡県",
          "doc_count" : 2948,
          "count_ken_goto" : {
            "value" : 2948
          },
          "shi_ruiji" : {
            "value" : 2880
          }
        },
        {
          "key" : "茨城県",
          "doc_count" : 2858,
          "count_ken_goto" : {
            "value" : 2858
          },
          "shi_ruiji" : {
            "value" : 2856
          }
        },
        {
          "key" : "石川県",
          "doc_count" : 2562,
          "count_ken_goto" : {
            "value" : 2562
          },
          "shi_ruiji" : {
            "value" : 2472
          }
        },
        {
          "key" : "青森県",
          "doc_count" : 2516,
          "count_ken_goto" : {
            "value" : 2516
          },
          "shi_ruiji" : {
            "value" : 2031
          }
        },
        {
          "key" : "三重県",
          "doc_count" : 2478,
          "count_ken_goto" : {
            "value" : 2478
          },
          "shi_ruiji" : {
            "value" : 2454
          }
        },
        {
          "key" : "神奈川県",
          "doc_count" : 2296,
          "count_ken_goto" : {
            "value" : 2296
          },
          "shi_ruiji" : {
            "value" : 2293
          }
        },
        {
          "key" : "福井県",
          "doc_count" : 2263,
          "count_ken_goto" : {
            "value" : 2263
          },
          "shi_ruiji" : {
            "value" : 2130
          }
        },
        {
          "key" : "岡山県",
          "doc_count" : 2190,
          "count_ken_goto" : {
            "value" : 2190
          },
          "shi_ruiji" : {
            "value" : 2180
          }
        },
        {
          "key" : "広島県",
          "doc_count" : 2161,
          "count_ken_goto" : {
            "value" : 2161
          },
          "shi_ruiji" : {
            "value" : 2123
          }
        },
        {
          "key" : "秋田県",
          "doc_count" : 2158,
          "count_ken_goto" : {
            "value" : 2158
          },
          "shi_ruiji" : {
            "value" : 2153
          }
        },
        {
          "key" : "岩手県",
          "doc_count" : 2074,
          "count_ken_goto" : {
            "value" : 2074
          },
          "shi_ruiji" : {
            "value" : 1915
          }
        },
        {
          "key" : "山形県",
          "doc_count" : 1958,
          "count_ken_goto" : {
            "value" : 1958
          },
          "shi_ruiji" : {
            "value" : 1947
          }
        },
        {
          "key" : "奈良県",
          "doc_count" : 1937,
          "count_ken_goto" : {
            "value" : 1937
          },
          "shi_ruiji" : {
            "value" : 1907
          }
        },
        {
          "key" : "熊本県",
          "doc_count" : 1897,
          "count_ken_goto" : {
            "value" : 1897
          },
          "shi_ruiji" : {
            "value" : 1861
          }
        },
        {
          "key" : "長崎県",
          "doc_count" : 1894,
          "count_ken_goto" : {
            "value" : 1894
          },
          "shi_ruiji" : {
            "value" : 1892
          }
        },
        {
          "key" : "大分県",
          "doc_count" : 1851,
          "count_ken_goto" : {
            "value" : 1851
          },
          "shi_ruiji" : {
            "value" : 1840
          }
        },
        {
          "key" : "滋賀県",
          "doc_count" : 1850,
          "count_ken_goto" : {
            "value" : 1850
          },
          "shi_ruiji" : {
            "value" : 1838
          }
        },
        {
          "key" : "栃木県",
          "doc_count" : 1834,
          "count_ken_goto" : {
            "value" : 1834
          },
          "shi_ruiji" : {
            "value" : 1831
          }
        },
        {
          "key" : "山口県",
          "doc_count" : 1813,
          "count_ken_goto" : {
            "value" : 1813
          },
          "shi_ruiji" : {
            "value" : 1656
          }
        },
        {
          "key" : "愛媛県",
          "doc_count" : 1750,
          "count_ken_goto" : {
            "value" : 1750
          },
          "shi_ruiji" : {
            "value" : 1742
          }
        },
        {
          "key" : "高知県",
          "doc_count" : 1695,
          "count_ken_goto" : {
            "value" : 1695
          },
          "shi_ruiji" : {
            "value" : 1690
          }
        },
        {
          "key" : "長野県",
          "doc_count" : 1684,
          "count_ken_goto" : {
            "value" : 1684
          },
          "shi_ruiji" : {
            "value" : 1666
          }
        },
        {
          "key" : "和歌山県",
          "doc_count" : 1601,
          "count_ken_goto" : {
            "value" : 1601
          },
          "shi_ruiji" : {
            "value" : 1597
          }
        },
        {
          "key" : "群馬県",
          "doc_count" : 1501,
          "count_ken_goto" : {
            "value" : 1501
          },
          "shi_ruiji" : {
            "value" : 1499
          }
        },
        {
          "key" : "鹿児島県",
          "doc_count" : 1459,
          "count_ken_goto" : {
            "value" : 1459
          },
          "shi_ruiji" : {
            "value" : 1449
          }
        },
        {
          "key" : "徳島県",
          "doc_count" : 1426,
          "count_ken_goto" : {
            "value" : 1426
          },
          "shi_ruiji" : {
            "value" : 961
          }
        },
        {
          "key" : "鳥取県",
          "doc_count" : 1397,
          "count_ken_goto" : {
            "value" : 1397
          },
          "shi_ruiji" : {
            "value" : 1391
          }
        },
        {
          "key" : "島根県",
          "doc_count" : 1183,
          "count_ken_goto" : {
            "value" : 1183
          },
          "shi_ruiji" : {
            "value" : 1179
          }
        },
        {
          "key" : "山梨県",
          "doc_count" : 950,
          "count_ken_goto" : {
            "value" : 950
          },
          "shi_ruiji" : {
            "value" : 945
          }
        },
        {
          "key" : "宮崎県",
          "doc_count" : 877,
          "count_ken_goto" : {
            "value" : 877
          },
          "shi_ruiji" : {
            "value" : 876
          }
        },
        {
          "key" : "佐賀県",
          "doc_count" : 872,
          "count_ken_goto" : {
            "value" : 872
          },
          "shi_ruiji" : {
            "value" : 870
          }
        },
        {
          "key" : "沖縄県",
          "doc_count" : 801,
          "count_ken_goto" : {
            "value" : 801
          },
          "shi_ruiji" : {
            "value" : 799
          }
        },
        {
          "key" : "香川県",
          "doc_count" : 712,
          "count_ken_goto" : {
            "value" : 712
          },
          "shi_ruiji" : {
            "value" : 709
          }
        }
      ]
    }
  }
}

・集計する3

queryも指定できるので、一部の集計も可能。

GET /postalcode/_search
{
  "size": 0,
  "query": {
    "bool": {
      "filter": {
        "terms": {
          "ken.keyword": ["岐阜県", "愛知県", "三重県"]
        }
      }
    }
  },
  "aggs": {
    "total_value_count": {
      "value_count": {
        "field": "postalcode.keyword"
      }
    },
    "group_by_ken": {
      "terms": {
        "field": "ken.keyword",
        "size":50
      },
      "aggs": {
        "count_ken_goto": {
          "value_count": {
            "field": "postalcode.keyword"
          }
        },
        "shi_ruiji": {
          "cardinality": {
            "field": "postalcode.keyword"
          }
        }
      }
    }
  }
}
{
  "took" : 19,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 10000,
      "relation" : "gte"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "total_value_count" : {
      "value" : 13563
    },
    "group_by_ken" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "愛知県",
          "doc_count" : 7713,
          "count_ken_goto" : {
            "value" : 7713
          },
          "shi_ruiji" : {
            "value" : 7231
          }
        },
        {
          "key" : "岐阜県",
          "doc_count" : 3372,
          "count_ken_goto" : {
            "value" : 3372
          },
          "shi_ruiji" : {
            "value" : 3369
          }
        },
        {
          "key" : "三重県",
          "doc_count" : 2478,
          "count_ken_goto" : {
            "value" : 2478
          },
          "shi_ruiji" : {
            "value" : 2454
          }
        }
      ]
    }
  }
}

メモ

・以下のエラーが出たら

Can't update non dynamic settings

openな状態ではインデックスの設定を変更できない。closeして、設定変更して、openする。

例えば、インデックスにアナライザーの追加。

POST /customer/_close
{
}
PUT /customer/_settings
{
  "analysis": {
    "analyzer": {
      "my_analyzer": {
        "tokenizer": "kuromoji_tokenizer",
        "filter": [
          "kuromoji_baseform"
        ]
      }
    }
  }
}
POST /customer/_open
{
}

・マッピングの追加

PUT /customer/_mapping
{
  "properties": {
    "jikoshokai": {
      "type": "text",
      "fields": {
        "keyword": { 
          "type":     "text",
          "analyzer": "my_analyzer"
        }
      }
    }
  }
}

・マッピングを変更できないときは、別indexを作って、コピー(_reindex)

POST /_reindex
{
  "source": {
    "index": "customer"
  },
  "dest": {
    "index": " customer_new"
  }
}

関連するメモ

コメント