DjangoプロジェクトのElasticsearch検索エンジン
1.Dockerを使用してElasticsearchとその拡張子をインストール
ミラーを取得し、ネットワークpullを介して
またはミラーファイルのロード
elasticsearchのプロファイルを変更elasticsearc-2.4.6/config/elasticsearch.yml 54行目、ipアドレスをネイティブipアドレスに変更
dockerコンテナ実行の作成
2.haystackを使用してElasticsearchをドッキングする
1)取付
drf-haystackは、REST frameworkでhaystackを使用するためのパッケージです(Djangoでhaystackを使用する場合はdjango-haystackをインストールすればよい).
2)アプリケーションの登録
3)構成
プロファイルでhaystackが使用する検索エンジンのバックエンドを構成する
4)インデックスクラスの作成検索エンジンがどのフィールドにインデックスを作成するかを示す
goodsアプリケーションで新しいsearch_indexes.pyファイル、インデックスクラスの格納(ファイル名固定) document=Trueテーブル名このフィールドは、主にキーワードクエリを行うフィールド です. use_template=Trueは、テンプレートによってインデックス値がどのモデルクラスフィールドからなるかを示す を表す.
5)templatesディレクトリにtextフィールドで使用するテンプレートファイルを作成する
templates/search/indexes/goods/sku_text.txtファイルで定義パス固定:templates/search/indexes/インデックス作成アプリケーション名/ファイル名.txt skuのname、caption、idによるキーワードインデックスクエリ 6)手動で初期インデックスを生成する
7)シーケンサの作成
goods/serializers.pyでhaystackシーケンス化器を作成する
説明: SKUIndexSerializerシーケンサを使用して、フロントエンドから入力されたパラメータtextをチェックし、データを取得した後、このシーケンサを使用してフロントエンドに戻ります. SKUIndexSerializerシーケンサのobjectフィールドは、フロントエンドにデータを返すときにシーケンシングするためのフィールドです.
8)ビューの作成
goods/views.pyでビューを作成する
9)ルーティングの定義
REST frameworkのrouterでルーティングを定義する
バグの説明:
haystackを構成してプログラムを起動した後、drf-haystackが最新バージョンのREST frameworkフレームワークに適していないため、次の異常が発生しました.
REST frameworkフレームワークコードを修正することで、
ファイルパス仮想環境での
ミラーを取得し、ネットワークpullを介して
sudo docker image pull delron/elasticsearch-ik:2.4.6-1.0
またはミラーファイルのロード
sudo docker load -i elasticsearch-ik-2.4.6_docker.tar
elasticsearchのプロファイルを変更elasticsearc-2.4.6/config/elasticsearch.yml 54行目、ipアドレスをネイティブipアドレスに変更
network.host: 127.0.0.1
dockerコンテナ実行の作成
sudo docker run -dti --network=host --name=elasticsearch -v /home/python/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0
2.haystackを使用してElasticsearchをドッキングする
1)取付
pip install drf-haystack
pip install elasticsearch==2.4.1
drf-haystackは、REST frameworkでhaystackを使用するためのパッケージです(Djangoでhaystackを使用する場合はdjango-haystackをインストールすればよい).
2)アプリケーションの登録
INSTALLED_APPS = [
...
'haystack',
...
]
3)構成
プロファイルでhaystackが使用する検索エンジンのバックエンドを構成する
# Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://127.0.0.1:9200/', # elasticsearch ip , 9200
'INDEX_NAME': 'meiduo', # elasticsearch
},
}
# 、 、 ,
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
4)インデックスクラスの作成検索エンジンがどのフィールドにインデックスを作成するかを示す
goodsアプリケーションで新しいsearch_indexes.pyファイル、インデックスクラスの格納(ファイル名固定)
from haystack import indexes
from .models import SKU
class SKUIndex(indexes.SearchIndex, indexes.Indexable):
"""
SKU
"""
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
""" """
return SKU
def index_queryset(self, using=None):
""" """
return self.get_model().objects.filter(is_launched=True)
5)templatesディレクトリにtextフィールドで使用するテンプレートファイルを作成する
templates/search/indexes/goods/sku_text.txtファイルで定義
{{ object.name }}
{{ object.caption }}
{{ object.id }}
python manage.py rebuild_index
7)シーケンサの作成
goods/serializers.pyでhaystackシーケンス化器を作成する
from drf_haystack.serializers import HaystackSerializer
class SKUIndexSerializer(HaystackSerializer):
"""
SKU
"""
object = SKUSerializer(read_only=True)
class Meta:
index_classes = [SKUIndex]
fields = ('text', 'object')
説明:
8)ビューの作成
goods/views.pyでビューを作成する
from drf_haystack.viewsets import HaystackViewSet
class SKUSearchViewSet(HaystackViewSet):
"""
SKU
"""
index_models = [SKU]
serializer_class = SKUIndexSerializer
9)ルーティングの定義
REST frameworkのrouterでルーティングを定義する
router = DefaultRouter()
router.register('skus/search', views.SKUSearchViewSet, base_name='skus_search')
urlpatterns += router.urls
バグの説明:
haystackを構成してプログラムを起動した後、drf-haystackが最新バージョンのREST frameworkフレームワークに適していないため、次の異常が発生しました.
importError: cannot import name '_get_count'
REST frameworkフレームワークコードを修正することで、
_get_count
関数定義を補足すればよいファイルパス仮想環境での
lib/python3.6/site-packages/rest_framework/pagination.py
def _get_count(queryset):
"""
Determine an object count, supporting either querysets or regular lists.
"""
try:
return queryset.count()
except (AttributeError, TypeError):
return len(queryset)