zoukankan      html  css  js  c++  java
  • Django-haystack对接elasticsearch

    如果直接在Django项目直接编写代码作为ElasticSearch的客户端,比较复杂,所以借助第三方包Haystack来对接ELasticSearch的客户端。而且使用了Haystack后,以后你换其他的全文搜索服务器时,也不用修改Django项目已经写好的代码。

    elasticsearch工作原理

    前期准备

    1. 安装elasticsearch,参考https://blog.csdn.net/wzyaiwl/article/details/89713055
    2. 安装django-haystack,pip install django-haystack
    3. 安装elasticsearch,pip install elasticsearch

    项目配置

    在settings配置如下:

    1.  
      #注册app
    2.  
      INSTALLED_APPS = [
    3.  
      'haystack',
    4.  
      ]
    5.  
       
    6.  
      ELASTICSEARCH_DSL = {
    7.  
      'default': {
    8.  
      'hosts': '127.0.0.1:8002'
    9.  
      },
    10.  
      }
    11.  
       
    12.  
      #配置haystack全文检索框架
    13.  
      HAYSTACK_CONNECTIONS = {
    14.  
      'default': {
    15.  
      'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
    16.  
      'URL': 'http://127.0.0.1:8002/', # 此处为elasticsearch运行的服务器ip地址,端口号默认为9200
    17.  
      'INDEX_NAME': 'dj_pre_class', # 指定elasticsearch建立的索引库的名称
    18.  
      },
    19.  
      }
    20.  
       
    21.  
      # 设置每页显示的数据量
    22.  
      HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5
    23.  
      # 当数据库改变时,会自动更新索引
    24.  
      HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

    构建索引

    1、在app下新建一个search_indexes.py文件,在这个文件下写索引类。这个索引类的目的是指明哪些字段用来构造索引,哪些字段用来查询返回。以下面代码为例:

    1.  
      from haystack import indexes
    2.  
       
    3.  
      from .models import News
    4.  
       
    5.  
      class NewsIndex(indexes.SearchIndex, indexes.Indexable):
    6.  
      """
    7.  
      """
    8.  
       
    9.  
      # text表示被查询的字段,用户搜索的是这些字段的值,具体被索引的字段写在另一个文件里。
    10.  
      text = indexes.CharField(document=True, use_template=True)
    11.  
       
    12.  
      id = indexes.IntegerField(model_attr='id')
    13.  
      title = indexes.CharField(model_attr='title')
    14.  
      digest = indexes.CharField(model_attr='digest')
    15.  
      content = indexes.CharField(model_attr='content')
    16.  
      image_url = indexes.CharField(model_attr='image_url')
    17.  
      # comments = indexes.IntegerField(model_attr='comments')
    18.  
       
    19.  
      def get_model(self):
    20.  
      """返回建立索引的模型类
    21.  
      """
    22.  
      return News
    23.  
       
    24.  
      def index_queryset(self, using=None):
    25.  
      """返回要建立索引的数据查询集
    26.  
      """
    27.  
       
    28.  
      return self.get_model().objects.filter(is_delete=False, tag_id=1)
    1. 类名必须为需要检索的Model_name+Index
    2. 每个索引里面必须有且只能有一个字段为 document=True,这代表haystack 和搜索引擎将使用此字段的内容作为索引进行检索(primary field)。其他的字段只是附属的属性,方便调用,并不作为检索数据。
    3. 如果使用一个字段设置了document=True,则一般约定此字段名为text,这是在SearchIndex类里面一贯的命名,以防止后台混乱,当然名字你也可以随便改,不过不建议改。
    4. haystack提供了use_template=Truetext字段,这样就允许我们使用数据模板去建立搜索引擎索引的文件,说得通俗点就是索引里面需要存放一些什么东西
    5. text字段用于构造索引,只不过具体构造索引的值写在另一个文件内。
    6. id、title、digest、content、image_url用于以索引查询到的返回内容。
    7. get_model方法用于指明建立索引的对应模型。
    8. index_queryset方法用于返回建立索引的数据查询集。

    2、构造具体索引值

    在templatesearchindexesapp_namemodel_name_text.txt下构造索引值,这个路径是固定的。如果不按照这个路径的话,就在text字段内使用template_name 参数,指定模板文件。

    1.  
      {{ object.title }}
    2.  
      {{ object.digest }}
    3.  
      {{ object.content }}

    上述代码说明用字段title、digest、content来作为索引的方向。

    3、生成索引

    到项目目录下,执行代码python manage.py rebuild_index即可。

    构建视图

    1、到view文件内构造对应搜索功能的视图

    导包from haystack.views import SearchView as _SearchView。

    1.  
      class SearchView(_SearchView):
    2.  
      # 模版文件
    3.  
      template = 'news/search.html'
    4.  
       
    5.  
      # 重写响应方式,如果请求参数q为空,返回模型News的热门新闻数据,否则根据参数q搜索相关数据
    6.  
      def create_response(self):
    7.  
      kw = self.request.GET.get('q', '')
    8.  
      if not kw:
    9.  
      # 如果没有索引值,就全部搜索出来
    10.  
      show_all = True
    11.  
      hot_news = models.HotNews.objects.select_related('news').
    12.  
      only('news__title', 'news__image_url', 'news__id').
    13.  
      filter(is_delete=False).order_by('priority', '-news__clicks')
    14.  
       
    15.  
      paginator = Paginator(hot_news, settings.HAYSTACK_SEARCH_RESULTS_PER_PAGE)
    16.  
      try:
    17.  
      page = paginator.page(int(self.request.GET.get('page', 1)))
    18.  
      except PageNotAnInteger:
    19.  
      # 如果参数page的数据类型不是整型,则返回第一页数据
    20.  
      page = paginator.page(1)
    21.  
      except EmptyPage:
    22.  
      # 用户访问的页数大于实际页数,则返回最后一页的数据
    23.  
      page = paginator.page(paginator.num_pages)
    24.  
      return render(self.request, self.template, locals())
    25.  
      else:
    26.  
      show_all = False
    27.  
      qs = super(SearchView, self).create_response()
    28.  
      return qs

    2、配置对应路由

    几点补述

    1. haystack 默认是有几个变量的,这几个变量存在context 的,最终前端接受的数据都在context字典里,所以如果我们定义自己的变量的话,也需要加载context里,即通过重写extra_context方法。
    2. query 是我们搜索的关键字,form 一般不用,我们可以自己用表单的get提交方式模拟,但是表单的id必须是q。可以打断点,在self.query中查看我们的搜索关键字。
    3. create_response 方法可以自定义我们的响应体,里面帮我们实现了分页功能,我们可以在settings中设置分页的数量。
  • 相关阅读:
    『转载-保持学习的空杯心态』工作中如何做好技术积累
    使用java.io.RandomAccessFile更改文本文件的内容
    The relationship between Sonarcube coverage and code branch
    求学生单科流水表中单科最近/最新的考试成绩表的三种方案(可行性篇)
    HBase 默认配置文件 hbase-default.xml 注释解析
    大数据技术之_10_Kafka学习_Kafka概述+Kafka集群部署+Kafka工作流程分析+Kafka API实战+Kafka Producer拦截器+Kafka Streams
    大数据技术之_09_Flume学习_Flume概述+Flume快速入门+Flume企业开发案例+Flume监控之Ganglia+Flume高级之自定义MySQLSource+Flume企业真实面试题(重点)
    如何实现Linux+Windows双系统启动
    Linux系统下对NFS服务安全加固的方法
    awk的基本使用方法
  • 原文地址:https://www.cnblogs.com/hanzeng1993/p/11280474.html
Copyright © 2011-2022 走看看