在django中,使用haystack,Elasticsearc
2018-11-17 本文已影响0人
奶茶分你一半
使用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