目的
- pythonからElasticsearchを操作する
- python、Elasticsearchは別々のDockerコンテナで動作し、それぞれはdocker-composeで起動している
やらないこと
- docker-composeで行うDockerコンテナの起動方法(参考:DockerコンテナでElasticSearchを起動する(docker-compose))
- pythonの基礎知識(importとか)
環境
- OS: macOS Catalina 10.15.4
- Docker: 2.2.0.5
- docker-compose: 1.25.4
- ElasticSearch: 7.4.2
やったこと
登録処理を作成
コンテナでのpip installやコンテナ名は、構築した時の投稿を参照してください(参考:DockerコンテナでElasticSearchを起動する(docker-compose))
registration.py
import os
import elasticsearch
# 接続先のElastisearchを指定(今回はElasticsearchのコンテナ名を指定)
client = elasticsearch.Elasticsearch("elasticsearch")
game = {}
game['title'] = 'hiroky quest'
game['genre'] = 1
game['release_date'] = '2020/05/01'
game['memo'] = 'memo'
# indexを指定して登録を行う
client.index(index='games', doc_type='_doc', body=game)
接続先は今回はDocker Networkを使用しているので、コンテナ名を指定する
(ローカルで起動しているElasticsearchであれば「localhost:9200」を指定する)
# 接続先のElastisearchを指定(今回はElasticsearchのコンテナ名を指定)
client = elasticsearch.Elasticsearch("elasticsearch")
indexはRDSのテーブルにあたるものである(はず)で、RDSと違うところはindexを作らなくても登録を実行すると自動でindexを追加してくれる
mappingも自動で作成される(RDSのテーブル定義みたいなもの)
# indexを指定して登録を行う
client.index(index='games', doc_type='_doc', body=game)
検索をして登録を確認する
search.py
import os
import elasticsearch
# Elasticsearchのコンテナ名を指定(Docker Network)
client = elasticsearch.Elasticsearch("elasticsearch")
# index指定で検索
result = client.search(
index='games'
)
print(result)
client.search
で検索を行う。この場合はindexを全件検索する
# python3 search.py
{'took': 11, 'timed_out': False, '_shards': {'total': 1, 'successful': 1, 'skipped': 0, 'failed': 0}, 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'max_score': 1.0, 'hits': [{'_index': 'games', '_type': '_doc', '_id': 'AAyn53EBfM-Vwr_FW_d7', '_score': 1.0, '_source': {'title': 'hiroky quest', 'genre': 1, 'release_date': '2020/05/01', 'memo': 'memo'}}]}}
検索条件を指定して検索することも可能
search.py
import os
import elasticsearch
# Elasticsearchのコンテナ名を指定(Docker Network)
client = elasticsearch.Elasticsearch("elasticsearch")
# 条件検索
result = client.search(
index='games',
body={'query': {'match': {'genre': 1}}}
)
print(result)
この場合は'genre': 1
に該当するレコードが検索結果として得られる
'match'
は完全一致として検索する
感想
pythonのclientの使い方が簡単なので、楽に実装できた
まだ単純な登録と検索のみなので、使い込んでいきたいところ