在django中,使用haystack,Elasticsearch实现搜索功能

使用haystack,Elasticsearch实现商品搜索流程

from Mp
ps: 本文章意在自己练手时运用搜索功能,docker正常不会这么用(怕误导人嘻嘻嘻)

从线上获取镜像

docker image pull delron/elasticsearch-ik:2.4.6-1.0

修改提供的elasticsearc-2.4.6压缩包内config的.yml文件内容

network.host: 自己机器的IP地址

创建docker容器运行
/home/python/Desktop/elasticsearch-2.4.6/config 为配置文件路径

docker run -dti --network=host --name=elasticsearch -v /home/python/Desktop/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0

使用haystack对接Elasticsearch

安装haystack

pip install drf-haystack
pip install elasticsearch==2.4.1

配置

INSTALLED_APPS = [
    ...
    'haystack',
]

# 配置Haystack搜索引擎后端
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        # 端口号固定为9200
        'URL': 'http://192.168.188.136:9200/',
        # 指定elasticsearch建立的索引库的名称
        'INDEX_NAME': 'md_mall',
    },
}
# 当添加、修改、删除数据时,自动生成索引  es自动重建索引
# 保证了在Django运行起来后,有新的数据产生时,haystack仍然可以让Elasticsearch实时生成新数据的索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

模板文件

# 在模板中指定搜索列
templates/search/indexes/模型类名称/模型类小写_text.txt

# 内容
{{ object.name }}
{{ object.caption }}

索引类

# 新建search_indexes.py文件

from haystack import indexes
# 继承可改
from .models import 被搜索的模型类


# 被搜索引擎建立索引的字段索引类
# 类名可改为:xxxxIndex
class XxxxIndex(indexes.SearchIndex, indexes.Indexable):
    """xxxx索引数据模型类"""

    # document=True: 表名该字段是主要进行关键字查询的字段
    # use_template=True: 表示通过模板来指明模型类字段
    # 在模板中指定搜索列 templates/search/indexes/模型类名称/模型类小写_text.txt
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
        """返回建立索引的模型类"""
        # 模型类可改
        return 模型类 

    def index_queryset(self, using=None):
        """返回建立索引的数据查询集"""
        # is_launched 是否上架出售
        # 查询条件可修改
        return self.get_model().objects.filter(is_launched=True)

序列化器

from .search_indexes import XxxxIndex

class XxxxIndexSerializer(HaystackSerializer):
    """
    索引结果序列化器
    检查前端传入的参数text,并且检索出数据后再使用这个序列化器返回给前端
    """

    # 向前端返回数据时序列化的字段
    # Haystack通过Elasticsearch检索出搜索结果后,
    # 会在数据库中取出完整的数据库模型类对象,放到object中
    # 序列化器可改
    object = xxxxSerializer(read_only=True)

    class Meta:
        # 索引类名称可改
        index_classes = [XxxxIndex]
        fields = (
            'text',  # 用于接收查询关键字
            'object'  # 用于返回查询结果
        )

创建视图集

class XxxxSearchViewSet(HaystackViewSet):
    """Xxxx搜索"""

    # 模型类可改
    index_models = [Xxxx]

    serializer_class = XxxxIndexSerializer

    # 分页
    pagination_class = XxxxListPagination

手动生成初始索引

python manage.py rebuild_index

定义路由

from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('定义的路径', views.XxxxSearchViewSet, base_name='xxxx_search')
urlpatterns += router.urls

你可能感兴趣的:(在django中,使用haystack,Elasticsearch实现搜索功能)