django-elasticindex
Django用 Elasticsearch の薄いラッパー
できること
・Django モデルと対応させ、Elasticsearch にデータを流し込むことができます。
(モデルとの対応は必須ではありません)
・Djangoクエリセットに少し近い形式で、クエリを発行することができます。
クエリには Elasticsearch のクエリに用いるための辞書をそのまま用いる、 あまり分厚くない(お節介の少ない)インターフェイスとなっています。
Install
$ pip install django-elasticindex
サンプルコード
リポジトリ内の、tests ディレクトリに動作するコードがあります。
1. Djangoのモデルの定義
models.py
from django.db import models
class DummyModel(models.Model):
key = models.CharField(max_length=20, primary_key=True)
value = models.TextField()
2. ElasticDocument クラスの定義
from elasticindex.models import ElasticDocument, ElasticDocumentField as F
class DummyESDocument(ElasticDocument):
INDEX = "elasticindex_test"
ALLOW_KUROMOJI = False
source_model = DummyModel
key = F(mapping={"type": "string", "index": "not_analized"})
value = F(mapping={"type": "string"})
3. データ流し込みバッチ
DummyESDocument.rebuild_index()
rebuild_index() を実行すると、Elasticsearch 上にインデックスを作成し(存在しない場合)、 対応するDjango モデル ( DummyModel ) の全データを DB から読み出し、Elasticsearch に入れます。
3-1. 特定のモデルインスタンスのデータを入れる
i = DummyModel.objects.get(key="xxx")
DummyESDocument.rebuild_index_by_source_model(i)
これで、1レコードの更新ができます
4. 検索
4-1. シンプルな検索
results = DummyESDocument.objects.query({"match": {"key": "jumps"}})
results は、ElasticQuerySet のインスタンスです。
result = list(results)[0]
検索を行い、result には DummyESDocument のインスタンスが入ります。
4-2. OR検索
qs = DummyESDocument.objects.query(
{"bool": {
"should": [
{"match": {"value": "dogs"}},
{"match": {"value": "fox"}},
]}})
query は Elasticsearch の query をそのまま使います。
4-3. ソート順変更
qs = DummyESDocument.objects.query({...})
qs = qs.order_by({"key": "desc"})
Django のクエリセットのように、order_by をメソッドチェーンしてください。
4-4. 結果のスライシング
qs = DummyESDocument.objects.query({...})
results = qs[:100]
こちらも、Djangoのクエリセットのように、Python のスライシングを行うと範囲指定できます。 実行したタイミングでクエリが評価され、HTTPリクエストが発行されます。
また、.limit(), .offset() というメソッドもあり、メソッドチェーンで使えます。
qs = DummyESDocument.objects.query({...})
qs = qs.limit(20).offset(40).order_by({"created_at": "desc"})
4-5. パジネーション
Django のクエリセットのように、
from django.core.paginator import Paginator
qs = DummyESDocument.objects.query({...})
paginator = Paginator(qs, 100)
page = paginator.page(1)
page.object_list...
Django の Paginator を用いてのパジネーションができます。
5. 設定
5-1. ローカルエリアの ES を指定する場合
settings.py
ELASTICINDEX_HOSTS = [{'host': '127.0.0.1', 'port': 9200}]
ELASTICINDEX_HOSTS を指定してください。
5-2. Amazon Elasticsearch Service を使う場合
ELASTICINDEX_HOSTS = [
{'host': 'xxxxxx.ap-northeast-1.es.amazonaws.com',
'port': 443}]
ELASTICINDEX_AWS_IAM = {
'access_id': 'AWSACCESSID',
'secret_key': 'AwsSecretKey******',
'region': 'ap-northeast-1',
}
Amazon ES へのアクセスを許可した IAM のクレデンシャルを settings に書いてください。
Amazon ES へのアクセス許可方法(IAMの作成方法)は Qiita に書きました
Amazon Elasticsearch Service を Python クライアントで、IAM アカウントを作ってセキュアにアクセスする - Qiita
http://qiita.com/ytyng/items/7c90c0b141aad9a12b38
6. テスト
クローンしたリポジトリで
$ docker run --rm -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.9.3
$ pip install -r requirements.txt
$ make test
実際に ES にアクセスを行う。 ESがローカルの 9200 ポートで動作していない場合は、local_settings.py を作成
local_settings.py
ELASTICINDEX_HOSTS = [{'host': 'my-elasticsearch-host', 'port': 9200}]
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file django-elasticindex-0.2.2.tar.gz.
File metadata
- Download URL: django-elasticindex-0.2.2.tar.gz
- Upload date:
- Size: 10.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/5.1.0 CPython/3.11.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4476596f5ba8625a86ffee4730717ced9f0eb342128c24e9d4bcb8065b460a23
|
|
| MD5 |
056064330337b6bb77a9acb4ca72d62a
|
|
| BLAKE2b-256 |
d65bf2e37228aab986ca4a952741f18686d03785a738bad400553785cb7ff4e3
|