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 调用VC++的动态链接库(DLL)
Sep 06 Python
打开电脑上的QQ的python代码
Feb 10 Python
python使用百度翻译进行中翻英示例
Apr 14 Python
python通过zlib实现压缩与解压字符串的方法
Nov 19 Python
python使用pil生成缩略图的方法
Mar 26 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
微信跳一跳python自动代码解读1.0
Jan 12 Python
Django urls.py重构及参数传递详解
Jul 23 Python
Python 私有化操作实例分析
Nov 21 Python
python使用建议技巧分享(三)
Aug 18 Python
PyCharm Community安装与配置的详细教程
Nov 24 Python
conda安装tensorflow和conda常用命令小结
Feb 20 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 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
PHP比你想象的好得多
2014/11/27 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
百度地图自定义控件分享
2015/03/04 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
webpack+vue.js实现组件化详解
2016/10/12 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
python中星号变量的几种特殊用法
2016/09/07 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
python删除过期log文件操作实例解析
2018/01/31 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
Python如何读取文件中图片格式
2020/01/13 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
JDO的含义
2012/11/17 面试题
法律顾问服务方案
2014/05/15 职场文书
日语系毕业求职信
2014/07/27 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
2014年超市员工工作总结
2014/11/18 职场文书
2015年财务部年度工作总结
2015/05/19 职场文书