Symfoware

Symfowareについての考察blog

Elasticsearch Pythonでsettinsとmappingを指定する

Elasticsearchにsettingsとmappingの指定をcurlで叩き込みました。
Elasticsearch 日本語データの分かち書きと検索(kuromoji使用)

同じことをPythonクライアントではどう実行すればよいか調べてみます。



サンプルコード



APIドキュメント
API Documentation

githubのリポジトリ
https://github.com/elasticsearch/elasticsearch-py

サンプルコード
https://github.com/elasticsearch/elasticsearch-py/blob/master/example/load.py

ここらへんを読んで書いたプログラムがこちら。



  1. # -*- coding:utf-8 -*-
  2. from elasticsearch import Elasticsearch
  3. from elasticsearch import helpers
  4. def main():
  5.     
  6.     # コネクション確率
  7.     es = Elasticsearch(host='192.168.1.103', port=9200)
  8.     
  9.     # サンプルで作成したインデックスを削除
  10.     #es.indices.delete(index="test-index")
  11.     
  12.     settings = {
  13.         "settings": {
  14.             "analysis": {
  15.                 "tokenizer": {
  16.                     "kuromoji_search": {
  17.                         "type": "kuromoji_tokenizer",
  18.                         "mode" : "search"
  19.                     }
  20.                 },
  21.     
  22.                 "analyzer": {
  23.                     "my_analyzer": {
  24.                         "type": "custom",
  25.                         "tokenizer": "kuromoji_search"
  26.                     }
  27.                 }
  28.             }
  29.         }
  30.     }
  31.     
  32.     
  33.     mapping = {
  34.         "zip-code": {
  35.             "properties": {
  36.                 "zipcode": {
  37.                     "type": "string"
  38.                 },
  39.                 "address": {
  40.                     "type": "string",
  41.                     "index": "analyzed",
  42.                     "analyzer": "my_analyzer"
  43.                 }
  44.             }
  45.         }
  46.     }
  47.     
  48.     # settingsを指定してインデックスを作成
  49.     es.indices.create(index='test-index', body=settings)
  50.     
  51.     # 作成したインデックスのマッピングを指定
  52.     es.indices.put_mapping(index='test-index', doc_type='zip-code', body=mapping)
  53.     
  54.     
  55.     
  56.     
  57. if __name__ == '__main__':
  58.     main()




bodyには文字列を指定するものだと思いはまりました。
dictオブジェクトを渡すのが正解です。



ちなみに文字列を渡した時はこんなエラーが発生します。


elasticsearch.exceptions.RequestError:
TransportError(400, u'MapperParsingException[Root type mapping not empty after parsing! Remaining fields:
[test-index : {mappings={zip-code={properties={zipcode={type=string}, address={type=string, analyzer=my_analyzer}}}}}]]')

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/11/09(日) 13:36:01|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Debian 7 + kibana 3.1.2 + nginxの環境構築 | ホーム | Elasticsearch 日本語データの分かち書きと検索(kuromoji使用)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1544-8e72b2a8
この記事にトラックバックする(FC2ブログユーザー)