Django Haystack 全文检索与关键词高亮

Django Haystack 全文检索与关键词高亮

作者:HelloGitHub-追梦人物

文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库

博客提供 RSS 订阅应该是标配,这样读者就可以通过一些聚合阅读工具订阅你的博客,时时查看是否有文章更新,而不必每次都跳转到博客上来查看。现在我们就来为博客添加 RSS 订阅功能。

在此之前我们使用了 Django 内置的一些方法实现了一个简单的搜索功能。但这个搜索功能实在过于简单,没有多大的实用性。对于一个搜索引擎来说,至少应该能够根据用户的搜索关键词对搜索结果进行排序以及高亮关键字。现在我们就来使用 django-haystack 实现这些特性。

Django Haystack 简介

django-haystack 是一个专门提供搜索功能的 django 第三方应用,它支持 Solr、Elasticsearch、Whoosh、Xapian 等多种搜索引擎,上一版本的教程中我们使用 Whoosh 加 jieba 中文分词的方案,原因是为了简单,无需安装外部服务。但现在有了 docker,安装一个外部服务就是轻而易举的事情,所以这次我们采用更为强大的 elasticsearch 作为我们博客的搜索引擎,同时使用 elasticsearch 的中文分词插件 ik,来提升中文搜索的效果。

安装必要依赖 安装 django-haystack

django-haystack 安装非常简单,只需要执行 pipenv install django-haystack 即可。需要注意的是,目前 elasticsearch 有 2 系列和 5 系列两大版本,本来新项目的原则是尽可能采用新版本,但目前 django-haystack 在 pypi 上发布的稳定版只支持 elasticsearch2,master 分支下支持 elasticsearch5,因此处于稳定性考虑,我们暂时使用 elasticsearch2,后续如果 django-haystack 发布了支持 elasticsearch5 的pypi版本,我们会升级到 elasticsearch5,有了 docker,升级就是轻而易举的事情。

由于使用 elasticsearch 服务,haystack 连接 elasticsearch 需要 python 版本的 SDK 支持,因此还需要安装 elasticsearch python SDK,这里我们不要直接使用 pipenv 安装,而是手动编辑 Pipfile 文件,指定 SDK 的版本,否则 pipenv 默认会安装最新版。打开 Pipfile 文件,将依赖手动添加到 packages 板块下:

[packages] django = "~=2.2" elasticsearch = ">=2,<3" 安装 elasticsearch 2

接下来就是构建一个新的容器来运行 elasticsearch 服务,因此首先需要来编排容器镜像,回顾一下容器镜像的目录结构:

compose\ local\ production\ django\ nginx\

由于 elasticsearch 在线上环境和本地测试都要使用,我们把镜像编排在 production 目录下,新建一个 elasticsearch 目录,用来存放和 elasticsearch 相关的内容。Dockfile 内容如下:

FROM elasticsearch:2.4.6-alpine COPY ./compose/production/elasticsearch/elasticsearch-analysis-ik-1.10.6.zip /usr/share/elasticsearch/plugins/ RUN cd /usr/share/elasticsearch/plugins/ && mkdir ik && unzip elasticsearch-analysis-ik-1.10.6.zip -d ik/ RUN rm /usr/share/elasticsearch/plugins/elasticsearch-analysis-ik-1.10.6.zip USER root COPY ./compose/production/elasticsearch/elasticsearch.yml /usr/share/elasticsearch/config/ RUN chown elasticsearch:elasticsearch /usr/share/elasticsearch/config/elasticsearch.yml USER elasticsearch

这个镜像从 elasticsearch 的官方基础镜像 2.4.6 版本进行构建,接着我们把 ik 分词插件复制到 elasticsearch 安装插件的目录下,然后解压启用。

接着我们又把 elasticsearch.yml 配置文件复制到容器内,然后切换用户为 elasticsearch,因为我们将以 elasticsearch 用户和组运行 elasticsearch 服务。

elasticsearch.yml 配置文件内容很简单:

bootstrap.memory_lock: true network.host: 0.0.0.0

其中 bootstrap.memory_lock 这个参数是为了提高 elasticsearch 的效率(涉及到 JVM 相关的优化,不做过多介绍)。network.host 指定服务启动的地址。

接着修改 docker compose 文件,我们先在本地启动,因此修改 local.yml 文件,加入 elasticsearch 服务:

version: '3' volumes: database_local: esdata_local: services: hellodjango_blog_tutorial_local: # 其它配置不变... depends_on: - elasticsearch_local elasticsearch_local: build: context: . dockerfile: ./compose/production/elasticsearch/Dockerfile image: elasticsearch_local container_name: elasticsearch_local volumes: - esdata_local:/usr/share/elasticsearch/data ports: - "9200:9200" environment: - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 nproc: 65536 nofile: soft: 65536 hard: 65536

主要是加入了 elasticsearch 服务,其中 environment 和 ulimits 的参数与 elasticksearch 服务调优有关,对于简单的博客搜索来说,调优的意义不是很大,因此这里不做过多介绍,感兴趣的可以参考 elasticksearch 的。

配置 Haystack

安装好 django haystack 后需要在项目的 settings.py 做一些简单的配置。

首先是把 django haystack 加入到 INSTALLED_APPS 设置里:

blogproject/settings.py INSTALLED_APPS = [ 'django.contrib.admin', # 其它 app... 'haystack', 'blog', 'comments', ]

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsjwg.html