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中bisect模块用法实例
Sep 25 Python
Python简单遍历字典及删除元素的方法
Sep 18 Python
Python KMeans聚类问题分析
Feb 23 Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 Python
python爬取内容存入Excel实例
Feb 20 Python
python实现对象列表根据某个属性排序的方法详解
Jun 11 Python
利用pyecharts实现地图可视化的例子
Aug 12 Python
基于Python批量生成指定尺寸缩略图代码实例
Nov 20 Python
在django中自定义字段Field详解
Dec 03 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
Python dict的常用方法示例代码
Jun 23 Python
Python趣味挑战之给幼儿园弟弟生成1000道算术题
May 28 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
漂亮但不安全的CTB
2006/10/09 PHP
PHP常用技巧汇总
2016/03/04 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
Javasipt:操作radio标签详解
2013/12/30 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
extjs 时间范围选择自动判断的实现代码
2014/06/24 Javascript
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
2015/04/25 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
js操作数据库实现注册和登陆的简单实例
2016/05/26 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
vue结合axios与后端进行ajax交互的方法
2018/07/06 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
python3.0 字典key排序
2008/12/24 Python
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
浅谈python迭代器
2017/11/08 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
Python2和3字符编码的区别知识点整理
2019/08/08 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
python中time库的实例使用方法
2019/10/31 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
python画环形图的方法
2020/03/25 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
内业资料员岗位职责
2014/01/04 职场文书
银行见习期自我鉴定
2014/01/29 职场文书
办公室文员自荐书
2014/02/03 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
借款民事起诉状范文
2015/05/19 职场文书
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js
MySQL批量更新不同表中的数据
2022/05/11 MySQL