zoukankan      html  css  js  c++  java
  • django使用haystack来调用Elasticsearch搜索引擎

    如何使用django来调用Elasticsearch实现全文的搜索

      环境:django ==1.11.11

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

      1.首先安装相关的依赖包:

    pip install drf-haystack
    pip install elasticsearch==2.4.1

      2. 在django项目配置文件中注册应用:

    INSTALLED_APPS = [
        ...
        'haystack',
        ...
    ]

      3.在django项目配置文件中指定搜索的后端:

    # Haystack
    HAYSTACK_CONNECTIONS = {
        'default': {
            'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
            'URL': 'http://your_ip:9200/',  # 此处为elasticsearch运行的服务器ip地址,端口号固定为9200
            'INDEX_NAME': 'demo',  # 指定elasticsearch建立的索引库的名称
        },
    }
    
    # 当添加、修改、删除数据时,自动生成索引
    HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

    4.创建索引类:

    from haystack import indexes
    
    from .models import Demomodel
    
    
    class DemoIndex(indexes.SearchIndex, indexes.Indexable):
        """
        索引数据模型类
        """
        text = indexes.CharField(document=True, use_template=True)
    
        def get_model(self):
            """返回建立索引的模型类"""
            return Demomodel
    
        def index_queryset(self, using=None):
            """返回要建立索引的数据查询集"""
            return self.get_model().objects.filter(is_launched=True)
    """
    
    说明: 
      在DemoIndex建立的字段,都可以借助haystack由elasticsearch搜索引擎查询。   其中text字段声明为document
    =True,表名该字段是主要进行关键字查询的字段, 该字段的索引值可以由多个数据库模型类字段组成,具体由哪些模型类字段组成,我们用use_template=True表示后续通过模板来指明。   在REST framework中,索引类的字段会作为查询结果返回数据的来源 """

    5. 在templates目录中创建text字段使用的模板文件

    templates/search/indexes/demo/demo_text.txt文件中定义

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

    6.创建haystack序列化器

    from drf_haystack.serializers import HaystackSerializer
    
    class DemoSerializer(serializers.ModelSerializer):
        """
        序列化器
        """
        class Meta:
            model = Demo
            fields = ('id', 'name')
    
    class DemoIndexSerializer(HaystackSerializer):
        """
        SKU索引结果数据序列化器
        """
        object = DemoSerializer(read_only=True)
    
        class Meta:
            index_classes = [DemoIndex]
            fields = ('text', 'object')

    7.创建视图

    from drf_haystack.viewsets import HaystackViewSet
    
    class DemoSearchViewSet(HaystackViewSet):
        index_models = [Demo]
    
        serializer_class = DemoIndexSerializer

    8. 添加路由,使用通过REST framework的router来定义路由

    router = DefaultRouter()
    router.register('/', views.DemoSearchViewSet, base_name='demo_search')
    
    ...
    
    urlpatterns += router.urls

    9.测试

    http://127.0.0.1:8000/?text=something
  • 相关阅读:
    关于课内外读物的建议
    c# Aes加解密
    web api 如何通过接收文件流的方式,接收客户端及前端上传的文件
    c# 文件夹权限
    mysql 8创建远程访问用户以及连接mysql速度慢的解决方法
    为什么读书?读书让我们明心见性!
    大部分教程不会告诉你的 12 个 JS 技巧
    nuget包管理nuget服务器发布包时出现请求报错 406 (Not Acceptable)
    Python 实现毫秒级淘宝、京东、天猫等秒杀抢购脚本
    eos的资源和工具列表
  • 原文地址:https://www.cnblogs.com/x931890193/p/9385312.html
Copyright © 2011-2022 走看看