Django项目之Elasticsearch搜索引擎的实例


Posted in Python onAugust 21, 2019

1.使用Docker安装Elasticsearch及其扩展

获取镜像,可以通过网络pull

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

或者加载镜像文件

sudo docker load -i elasticsearch-ik-2.4.6_docker.tar

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

network.host: 127.0.0.1

创建docker容器运行

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

2. 使用haystack对接Elasticsearch

1)安装

pip install drf-haystack
pip install elasticsearch==2.4.1

drf-haystack是为了在REST framework中使用haystack而进行的封装(如果在Django中使用haystack,则安装django-haystack即可)。

2)注册应用

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

3)配置

在配置文件中配置haystack使用的搜索引擎后端

# Haystack
HAYSTACK_CONNECTIONS = {
 'default': {
  'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
  'URL': 'http://127.0.0.1:9200/', # 此处为elasticsearch运行的服务器ip地址,端口号固定为9200
  'INDEX_NAME': 'meiduo', # 指定elasticsearch建立的索引库的名称
 },
}

# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

4)创建索引类

指明让搜索引擎对哪些字段建立索引

goods应用中新建search_indexes.py文件,用于存放索引类(文件名固定)

from haystack import indexes

from .models import SKU


class SKUIndex(indexes.SearchIndex, indexes.Indexable):
 """
 SKU索引数据模型类
 """
 text = indexes.CharField(document=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)

document=True 表名该字段是主要进行关键字查询的字段

use_template=True 表示通过模板来指明索引值由哪些模型类字段组成

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

在templates/search/indexes/goods/sku_text.txt文件中定义

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

路径固定: templates/search/indexes/建立索引的应用名/文件名.txt

通过sku的name、caption、id来进行关键字索引查询

6)手动生成初始索引

python manage.py rebuild_index

7)创建序列化器

在goods/serializers.py中创建haystack序列化器

from drf_haystack.serializers import HaystackSerializer


class SKUIndexSerializer(HaystackSerializer):
 """
 SKU索引结果数据序列化器
 """
 object = SKUSerializer(read_only=True)

 class Meta:
  index_classes = [SKUIndex]
  fields = ('text', 'object')

说明:

使用SKUIndexSerializer序列化器用来检查前端传入的参数text,并且检索出数据后再使用这个序列化器返回给前端;

SKUIndexSerializer序列化器中的object字段是用来向前端返回数据时序列化的字段。

8)创建视图

在goods/views.py中创建视图

from drf_haystack.viewsets import HaystackViewSet

class SKUSearchViewSet(HaystackViewSet):
 """
 SKU搜索
 """
 index_models = [SKU]

 serializer_class = SKUIndexSerializer

9)定义路由

通过REST framework的router来定义路由

router = DefaultRouter()
router.register('skus/search', views.SKUSearchViewSet, base_name='skus_search')
urlpatterns += router.urls

bug说明:

如果在配置完haystack并启动程序后,出现如下异常,是因为drf-haystack还没有适配最新版本的REST framework框架

importError: cannot import name '_get_count'

可以通过修改REST framework框架代码,补充_get_count函数定义即可

文件路径 虚拟环境下的 lib/python3.6/site-packages/rest_framework/pagination.py

def _get_count(queryset):
 """
 Determine an object count, supporting either querysets or regular lists.
 """
 try:
  return queryset.count()
 except (AttributeError, TypeError):
  return len(queryset)

以上这篇Django项目之Elasticsearch搜索引擎的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中精确输出JSON浮点数的方法
Apr 18 Python
用Python制作在地图上模拟瘟疫扩散的Gif图
Mar 31 Python
Python中splitlines()方法的使用简介
May 20 Python
在Python中操作日期和时间之gmtime()方法的使用
May 22 Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 Python
Python实现判断字符串中包含某个字符的判断函数示例
Jan 08 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
django页面跳转问题及注意事项
Jul 18 Python
Python Pandas 箱线图的实现
Jul 23 Python
pygame实现贪吃蛇游戏(上)
Oct 29 Python
python实例化对象的具体方法
Jun 17 Python
详解用Python把PDF转为Word方法总结
Apr 27 Python
python爬虫豆瓣网的模拟登录实现
Aug 21 #Python
Python Django 页面上展示固定的页码数实现代码
Aug 21 #Python
详解Python利用random生成一个列表内的随机数
Aug 21 #Python
Python Django 封装分页成通用的模块详解
Aug 21 #Python
Django之编辑时根据条件跳转回原页面的方法
Aug 21 #Python
python numpy 常用随机数的产生方法的实现
Aug 21 #Python
在django模板中实现超链接配置
Aug 21 #Python
You might like
7个超级实用的PHP代码片段
2011/07/11 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
关于javascript中的parseInt使用技巧
2009/09/03 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
jQuery基础语法实例入门
2014/12/23 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
js H5 canvas投篮小游戏
2016/08/18 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
2016/10/10 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
python实现的重启关机程序实例
2014/08/21 Python
Python中的模块和包概念介绍
2015/04/13 Python
Python最基本的数据类型以及对元组的介绍
2015/04/14 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python md5与sha1加密算法用法分析
2017/07/14 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
Python解析多帧dicom数据详解
2020/01/13 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
DOM和JQuery对象有什么区别
2016/11/11 面试题
写自荐信三大法宝
2014/01/24 职场文书
医学专业大学生职业生涯规划书
2014/10/25 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2014年师德师风工作总结
2014/11/25 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
Spring Boot实现文件上传下载
2022/08/14 Java/Android