DjangoプロジェクトのElasticsearch検索エンジン

11719 ワード

1.Dockerを使用してElasticsearchとその拡張子をインストール
ミラーを取得し、ネットワーク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)
  • document=Trueテーブル名このフィールドは、主にキーワードクエリを行うフィールド
  • です.
  • use_template=Trueは、テンプレートによってインデックス値がどのモデルクラスフィールドからなるかを示す
  • を表す.
    5)templatesディレクトリにtextフィールドで使用するテンプレートファイルを作成する
    templates/search/indexes/goods/sku_text.txtファイルで定義
    {{ object.name }}
    {{ object.caption }}
    {{ object.id }}
    
  • パス固定:templates/search/indexes/インデックス作成アプリケーション名/ファイル名.txt
  • skuのname、caption、idによるキーワードインデックスクエリ
  • 6)手動で初期インデックスを生成する
    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')
    

    説明:
  • SKUIndexSerializerシーケンサを使用して、フロントエンドから入力されたパラメータtextをチェックし、データを取得した後、このシーケンサを使用してフロントエンドに戻ります.
  • SKUIndexSerializerシーケンサの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)