zoukankan      html  css  js  c++  java
  • 用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序列化的形式进行处理,明确要返回的搜索结果中每个数据对象包含哪些字段。
    
    
  • 相关阅读:
    redis导入导出工具redisdump,centos7安装使用
    mysql 锁表情况,处理笔记
    python语言
    pythonhello world
    常用单词
    Django课堂笔记 1
    JS之随机点名系统
    js之简易计算器
    JS之放大镜效果
    SQLServer索引漫谈
  • 原文地址:https://www.cnblogs.com/cizao/p/11481916.html
Copyright © 2011-2022 走看看