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基于urllib实现按照百度音乐分类下载mp3的方法
May 25 Python
python学习教程之Numpy和Pandas的使用
Sep 11 Python
python模拟表单提交登录图书馆
Apr 27 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
Jul 12 Python
python 实现提取某个索引中某个时间段的数据方法
Feb 01 Python
Python进阶之@property动态属性的实现
Apr 01 Python
Python 将json序列化后的字符串转换成字典(推荐)
Jan 06 Python
python实现凯撒密码、凯撒加解密算法
Jun 11 Python
Python 添加文件注释和函数注释操作
Aug 09 Python
如何用python绘制雷达图
Apr 24 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
BBS(php & mysql)完整版(六)
2006/10/09 PHP
手把手教你使用DedeCms V3的在线采集图文教程
2007/04/03 PHP
PHP中include()与require()的区别说明
2010/03/10 PHP
PHP5常用函数列表(分享)
2013/06/07 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
PHP最常用的正则表达式
2017/02/13 PHP
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
p5.js实现斐波那契螺旋的示例代码
2018/03/22 Javascript
Seajs源码详解分析
2019/04/02 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
JS三级联动代码格式实例详解
2019/12/30 Javascript
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
总结Python中逻辑运算符的使用
2015/05/13 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
python 动态调用函数实例解析
2019/10/21 Python
python求前n个阶乘的和实例
2020/04/02 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
J2EE面试题集锦(附答案)
2013/08/16 面试题
建筑实习自我鉴定
2013/10/18 职场文书
药品促销活动方案
2014/02/14 职场文书
四群教育工作实施方案
2014/03/26 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
2014年党员个人剖析材料
2014/10/08 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis
Python中如何处理常见报错
2022/01/18 Python