用es实现模糊搜索




Haystack为Django提供了模块化的搜索。它的特点是统一的,熟悉的API,可以让你在不修改代码的情况下使用不同的搜索后端(比如 Solr, Elasticsearch, Whoosh, Xapian 等等)。

drf-haystack是为了在REST framework中使用haystack而进行的封装(如果在Django中使用haystack,则安装django-haystack即可)。

settings.py
# Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://10.211.55.5:9200/',  # 此处为elasticsearch运行的服务器ip地址,端口号固定为9200
'INDEX_NAME': 'meiduo',  # 指定elasticsearch建立的索引库的名称,保存在elasticsearch镜像中
    },
}

# 当添加、修改、删除数据时,自动生成索引
#HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
是先注释掉的,在开发过程中,ip总是在变,搜索引擎是在docker中运行的,打开此设置的话,数据只要有变化就会自动生成索引,当ip变化时,就找不到了,将会报错。
当上线,ip固定再开启
创建search_indexes文件
from haystack import indexes
from goods.models import SKU


class SKUIndex(indexes.SearchIndex,indexes.Indexable):
 text = indexes.CharField(document=True,use_template=True)   
	#document=True为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) 在上架的商品
		get_model就是SKU模型类


templates/search/indexes/goods/sku_text.txt模板文件

{{ object.name }}
{{ object.caption }}
{{ object.id }}

此模板指明当将关键词通过text参数名传递时,可以通过sku的name、caption、id来进行关键字索引查询。
视图
class SKUSearchView(HaystackViewSet):       继承自HaystackViewSet
    index_models = [SKU]		      指明索引模型类,注意 中括号
    serializer_class = SKUSearchSerializer  
    pagination_class = PageNum		分页器类




序列化器
from rest_framework import serializers
from drf_haystack.serializers import HaystackSerializer

from goods.models import SKU
from goods.search_indexes import SKUIndex


class SKUSSerializers(serializers.ModelSerializer):
    class Meta:
        model = SKU
        fields = '__all__'


class SKUSearchSerializer(HaystackSerializer):   继承自haystack的序列化器类
    object = SKUSSerializers(read_only=True)
    class Meta:
        index_classes=[SKUIndex]
        fields=('text','object')

	搜索视图使用SKUSearchSerializer序列化器来检查前端输入的参数text,并且检索出数据后使用这序列化器返回给前端。
	SKUSearchSerializer 序列化器中的object字段使用来向前端返回数据时序列化的字段,
Haystack通过Elasticsearch检索出匹配关键词的搜索结果后,还会在数据库中取出完整的数据库模型类对象,放到搜索结果的object属性中,并将结果通过SKUIndexSerializer序列化器进行序列化。
	我们可以通过声明搜索结果的object字段以SKUSerializer序列化的形式进行处理,明确要返回的搜索结果中每个数据对象包含哪些字段。

posted @ 2019-09-07 17:20  π=3.1415926  阅读(3497)  评论(0编辑  收藏  举报