使用haystack实现Django的全文搜索 -- Elasticsearch搜索引擎

全文搜索:

在使用python进行web开发的时候,免不了需要使用到全文搜索;全文搜索和我们平常使用的数据库的模糊搜索查询不一样,例如在mysql数据库中,如果进行模糊查询,比如 name like '%wang%'这一类的,效率是非常低的;而我们需求的全文搜索,在效率方面要求是很高的,而且必须能够对中文进行分词处理。

haystack

1.介绍:

全文搜索的框架;Haystack是 BSD许可的,可以很好地与第三方应用程序配合使用,无需修改源代码,并支持Solr, Elasticsearch, Whoosh和 Xapian四种全文搜索引擎;也就是说,我们在使用Solr, Elasticsearch, Whoosh和 Xapian这四种搜索引擎的时候,不需要直接对它们直接进行操作,直接通过操作这个haystack框架,就可以进行进行全文搜索;可以让你在不修改代码的情况下使用不同的搜索后端。
haystack官网

2.使用:

在Django中使用haystack,可以通过 pip install django-haystack 即可;
当然,如果你的Django项目中,使用到 REST framework,那么可以直接安装 pip install drf-haystack

搜索引擎 Elasticsearch

1. 介绍:

开源的 Elasticsearch 是目前全文搜索引擎的首选。

它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。

Elasticsearch 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。所有的功能被集成到一个服务里面,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。

Elasticsearch 是用Java实现的,Elasticsearch 不支持对中文进行分词建立索引,需要配合扩展elasticsearch-analysis-ik来实现中文分词处理。

2.项目环境介绍:

注意:本文所介绍和使用的Elasticsearch是基于python和Django进行操作演练的。

开发环境:
python:3.5
Django:1.11.11
djangorestframework : 3.9.0
django-haystack : 2.8.1
Docker (由于使用的是python,这里演练不准备使用Java,所以用docker来运行Elasticsearch镜像的)

3.Elasticsearch 安装 和 运行:

使用java运行Elasticsearch可以参考:
https://es.xiaoleilu.com/010_Intro/10_Installing_ES.html

我们这里是使用镜像在docker中运行,镜像下载方式如下:

1.镜像的获取

1.1 可以通过网络pull

docker image pull delron/elasticsearch-ik:2.4.6-1.0

2.配置

修改elasticsearch的配置文件 elasticsearc-2.4.6/config/elasticsearch.yml第54行,更改ip地址为本机ip地址,比如:

network.host: 127.0.0.1

3.创建docker容器并进行运行

docker run -dti --network=host --name=elasticsearch -v /home/python/elasticsearch-6/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:1.0

注意:-v 后面的映射路径
/home/python/elasticsearch-2.4.6/config:指的是进行修改过的配置文件存在的路径;
/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0:是镜像文件运行的路径和版本;
文件存放的位置不同,在进行映射的时候,是不一样的。

再一次开启这个Elasticsearch镜像时,直接可以使用:
docker container start Elasticsearch 即可

haystack与Elasticsearch对接:

Elasticsearch到这一步,已经是运行起来了,那么我们如何来对其进行操作呢?
当然是使用我们haystack来进行对接;想要进行对接的话,除了之前安装过的drf-haystack,还需要在python中安装elasticsearch==2.4.1

1.基于python的客户端的安装:

pip install elasticsearch==1

这里需要提醒的是,版本是需要特别注意的,如果在安装的时候,后面不具体描述版本号,默认会下载最新的版本,但是兼容问题有待提升,所以为了不必要的bug,可以按照我的版本进行对应。

2.配置

通过django的haystack来操作,所以在django中进行相关配置是必不可少的:

settings.py中添加下面的配置信息:

1.应用注册:

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

2.使用haystack需要进行的配置:

HAYSTACK_CONNECTIONS = {
    default: {
        ENGINE': haystack.backends.elasticsearch_backend.ElasticsearchSearchEngineURLhttp://127.0.0.1:9200/INDEX_NAMEdjangotesthaystack.signals.RealtimeSignalProcessor'

HAYSTACK_SIGNAL_PROCESSOR 的配置保证了在Django运行起来后,有新的数据产生时,haystack仍然可以让Elasticsearch实时生成新数据的索引;当然,也是可以手动进行索引的生成:

python manage.py rebuild_index

3.索引的创建

1.索引文件创建:
在子应用目录下,添加一个索引,名为: search_indexes.py;
下面的代码在goods/search_indexes.py

from haystack import indexes
 # 修改此处,改成你自己的model
from goods.models  Goods    (Goods是子应用goods中的一个模型类) 

修改此处,类名为模型类的名称+Index,比如模型类为Goods,则这里类名为GoodsIndex
class GoodsIndex(indexes.SearchIndex,indexes.Indexable):
     指明哪些字段产生索引,产生索引的字段,会作为前端检索查询的关键字;
     document是指明text是使用的文档格式,产生字段的内容在文档中进行描述;
     use_template是指明在模板中被声明需要产生索引;
    text = indexes.CharField(document=True,use_template=True)

 此外可以存在,可以不存在,看具体需要的数据
    """下面这些字段,在索引类中进行申明,在REST framework中,索引类的字段可以被作为索引查询结果返回数据额来源"""
    id = indexes.IntegerField(model_attr=id)
    name = indexes.CharField(model_attr=name)
    price = indexes.DecimalField(model_attr=price)

    也就是说,前端在索引的时候,可以按照text=xxx,也可以按照id=xxx,name=xxx等,我们的数据返回也是返回id,name,price  修改此处,返回的是你自己的model
    def get_model(self):
        获取模型类"""
        return Goods
        
 修改return 可以修改返回查询集的内容,比如返回时,有什么条件限制的时候
    def index_queryset(self,using=None):
        声明满足索引要求的返回的查询集return Goods.objects.all()

说明:

1.在进行索引类的使用时,修改上述代码中的①②③④⑤即可;
2.此文件指定如何通过已有数据来建立索引。get_model处,直接将django中的model放过来,便可以直接完成索引啦,无需关注数据库读取、索引建立等细节。
3.text=indexes.CharField一句,指定了将模型类中的哪些字段建立索引,而use_template=True说明后续我们还要指定一个模板文件,告知具体是哪些字段;

2.指定索引使用的模板文件/指名需要建立索引的字段:

在项目的“templates/search/indexes/应用名称/”下创建“模型类名称_text.txt”文件
比如:
templates/search/indexes/goods/sku_text.txt:

这个是模板文件的路径,此文件指定将模型中的哪些字段建立索引
indexes: 用于索引; 
goods: 有索引的子应用名称; 
sku_text: sku是指明那个模型类,text是指明那个字段

 

 文件中写入的内容如下:

{{ object.字段1 }}
{{ object.字段2 }}
{{ object.字段3 }}

3.视图函数和序列化器:

(下面的视图函数和序列化器,如果你没有使用REST Framework,直接使用的Django话,那么可以直接写django中的视图函数,进行请求和响应数据的处理)

RESTFramework中的haystack中提供了相应的视图集和序列化器,可以直接进行使用:

创建haystack序列化器:

from drf_haystack.serializers  HaystackSerializer

 GoodsIndexSerializer(HaystackSerializer):
    
    Goods索引结果数据序列化器
    """
     Meta:
        index_classes = [GoodsIndex]
        fields = (text',')

注意fields属性的字段名与GoodsIndex类的字段对应

创建视图:

from drf_haystack.viewsets  HaystackViewSet

 GoodsSearchViewSet(HaystackViewSet):
    
    Goods搜索
    
    index_models = [Goods]

    serializer_class = GoodsIndexSerializer

4.路由

路由( haystack 视图函数用的是视图集,所以通过下面的方式添加路由):

from rest_framework.routers  DefaultRouter

router = DefaultRouter()
router.register(skus/searchskus_search)
urlpatterns += router.urls

 

原文地址:https://www.cnblogs.com/tracydzf

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有需要的朋友自行下载。
继承APIView和ViewSetMixin;作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。ViewSet在开发接口中不经常用。
一、Django介绍Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。Django学习线路Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。这个MVT模式并
本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小白快速搭建django项目,并对可能出现的报错进行了分析
uniapp微信小程序订阅消息发送服务通知
Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的MysqlDB连接,Python3 支持支持pymysql 所有需要在app里面的__init__加上下面配置:
url: re_path('authors/$', views.AuthorView.as_view()), re_path('book/(?P\d+)/$', vie
前提 关于html寻找路线: template 如果在各个APP中存在, Django 会优先找全局template 文件下的html文件,如果全局下的template文件没有相关的html Djan
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
from bs4 import BeautifulSoup#kindeditordef kindeditor(request): s = ''' <li><s
view.py 配置 html 配置
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault('content_type&#
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
return HttpResponse("OK") 返回一个字符串 return redirect("/index/") 返回URL return render
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault('content_type&#
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况
自动发送 > 依赖jQuery文件 实例-->GET请求: 手动发送 > 依赖浏览器XML对象(也叫原生ajax) Ajax主要就是使用 【XmlHttpRequest】对象来完成请
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
return HttpResponse("OK") 返回一个字符串 return redirect("/index/") 返回URL return render