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实现list反转实例汇总
Nov 11 Python
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 Python
Python中在for循环中嵌套使用if和else语句的技巧
Jun 20 Python
Python测试人员需要掌握的知识
Feb 08 Python
python 反向输出字符串的方法
Jul 16 Python
python得到qq句柄,并显示在前台的方法
Oct 14 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
python框架flask表单实现详解
Nov 04 Python
py-charm延长试用期限实例
Dec 22 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
Apr 15 Python
Pycharm github配置实现过程图解
Oct 13 Python
Python使用tkinter制作在线翻译软件
Feb 22 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
php简单随机字符串生成方法示例
2017/04/19 PHP
ThinkPHP 模板引擎使用详解
2017/05/07 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
js 替换功能函数,用正则表达式解决,js的全部替换
2010/12/08 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
Javascript改变CSS样式(局部和全局)
2013/12/18 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
[01:02:26]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第二场 1月18日
2021/03/11 DOTA
pyqt4教程之widget使用示例分享
2014/03/07 Python
Python实现Linux下守护进程的编写方法
2014/08/22 Python
简单了解Django ContentType内置组件
2019/07/23 Python
python根据文本生成词云图代码实例
2019/11/15 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
pytorch 实现tensor与numpy数组转换
2019/12/27 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
结婚喜宴家长答谢词
2014/01/15 职场文书
区级文明单位申报材料
2014/05/15 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL
python获取字符串中的email
2022/03/31 Python