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程序中解析并修改XML内容的方法
Nov 16 Python
python中实现精确的浮点数运算详解
Nov 02 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
使用pytorch进行图像的顺序读取方法
Jul 27 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
Python利用PyPDF2库获取PDF文件总页码实例
Apr 03 Python
python中format函数如何使用
Jun 22 Python
python中turtle库的简单使用教程
Nov 11 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
Dec 04 Python
Python列表元素删除和remove()方法详解
Jan 04 Python
Python matplotlib多个子图绘制整合
Apr 13 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
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
PHP 配置文件中open_basedir选项作用
2009/07/19 PHP
php实现的中文分词类完整实例
2017/02/06 PHP
php实时倒计时功能实现方法详解
2017/02/27 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
php实现页面纯静态的实例代码
2017/06/21 PHP
js word表格动态添加代码
2010/06/07 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
Dom 学习总结以及实例的使用介绍
2013/04/24 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
JavaScript实现百度搜索框效果
2020/03/26 Javascript
mpvue微信小程序开发之实现一个弹幕评论
2019/11/24 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
2020/07/07 Javascript
python设计模式大全
2016/06/27 Python
python3使用matplotlib绘制条形图
2020/03/25 Python
TensorFlow中如何确定张量的形状实例
2020/06/23 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
哈萨克斯坦移动和数字技术在线商店:SatelOnline.kz
2020/09/04 全球购物
兼职学生的自我评价
2013/11/24 职场文书
怎么写自荐书范文
2014/02/12 职场文书
如何写一份好的英文求职信
2014/03/19 职场文书
2014年助理政工师工作总结
2014/12/19 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
工商局调档介绍信
2015/10/22 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs
JS实现简单的九宫格抽奖
2022/06/28 Javascript
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers