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的常见命令注入威胁
Feb 18 Python
python实现批量下载新浪博客的方法
Jun 15 Python
Python中动态检测编码chardet的使用教程
Jul 06 Python
Python复数属性和方法运算操作示例
Jul 21 Python
python里使用正则的findall函数的实例详解
Oct 19 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
Mar 05 Python
Python自动化运维之Ansible定义主机与组规则操作详解
Jun 13 Python
Python中BeautifuSoup库的用法使用详解
Nov 15 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 Python
python语言中pandas字符串分割str.split()函数
Aug 05 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
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
php如何连接sql server
2015/10/16 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
javascript继承之为什么要继承
2012/11/10 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
微信小程序前端源码逻辑和工作流
2016/09/25 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
HTML5 通过Vedio标签实现视频循环播放的示例代码
2020/08/05 HTML / CSS
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
自我评价范文分享
2014/01/04 职场文书
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
2014年学校工作总结
2014/11/20 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
丧事答谢词大全
2015/09/30 职场文书
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL