Elasticsearch 介绍

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

首先安装 java 环境

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  

配置java环境变量

(1)新建->变量名"JAVA_HOME",变量值"C:\Java\jdk1.8.0_05"(即JDK的安装路径) 
(2)编辑->变量名"Path",在原变量值的最后面加上“;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin” 
(3)新建->变量名“CLASSPATH”,变量值“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar”

下载  elasticsearch-rtf

https://github.com/medcl/elasticsearch-rtf

启动 elasticsearch

进入bin 下执行

elasticsearch.bat

drf中使用

Haystack为Django提供了模块化的搜索。它的特点是统一的,熟悉的API,可以让你在不修改代码的情况下使用不同的搜索后端(比如 Solr, Elasticsearch, Whoosh, Xapian 等等)。

我们在django中可以通过使用haystack来调用Elasticsearch搜索引擎。

drf-haystack官方文档: https://drf-haystack.readthedocs.io/en/latest/

环境:django ==1.11.11

1.首先安装相关的依赖包:(这里原作者使用的是drf-haystack,如果项目没有使用drf组件,应该选用haystack包)

pip install drf-haystack
pip install elasticsearch==2.4.1

2.在django项目配置文件settings.py中注册应用:  

INSTALLED_APPS = [
...
'haystack',
...
]

3.在django项目配置文件settings.py中指定搜索的后端:(指定使用那个搜索引擎,服务器地址的配置,索引库的名称等配置)  

# Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
# 端口号固定为9200
'URL': 'http://192.168.247.128:9200/', # 此处为elasticsearch运行的服务器ip地址,端口号固定为9200
# 指定elasticsearch建立的索引库的名称
'INDEX_NAME': 'meiduo_mall',
# 保存索引文件的路径
# 'PATH': os.path.join(BASE_DIR, 'elastic_index'), # 如果搜索引擎是whoosh, 还需要设置PATH参数
},
}  
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

  

注意:

HAYSTACK_SIGNAL_PROCESSOR 的配置保证了在Django运行起来后,有新的数据产生时,haystack仍然可以让Elasticsearch实时生成新数据的索引

4 创建索引类  

通过创建索引类,来指明让搜索引擎对哪些字段建立索引,也就是可以通过哪些字段的关键字来检索数据。

在goods应用目录下新建一个search_indexes.py(固定的)文件,用于存放索引类。search_indexes.py 这个文件名是固定的,你需要对那个应用进行检索,就在那个应用下创建

代码如下

from haystack import indexes

from .models import goods

class SKUIndex(indexes.SearchIndex, indexes.Indexable):
"""
索引类, 告诉haystack在建立数据索引的时候使用
"""
text = indexes.CharField(document=True, use_template=True) def get_model(self):
"""把那个表建立索引"""
return goods def index_queryset(self, using=None):
"""返回要建立索引的数据查询集"""
return self.get_model().objects.filter()

说明:

在SKUIndex建立的字段,都可以借助haystack由elasticsearch搜索引擎查

其中text字段我们声明为document=True,表名该字段是主要进行关键字查询的字段, 该字段的索引值可以由多个数据库模型类字段组成,具体由哪些模型类字段组成,我们用use_template=True表示后续通过模板来

指明。其他字段都是通过model_attr选项指明引用数据库模型类的特定字段。

在REST framework中,索引类的字段会作为查询结果返回数据的来源。

5 在templates下面新建目录search/indexes/goods/goodssku_text.txt

 goods是和应用的名字对应上,而goodssku是和get_model中对象的名字(小写)对应上的

(关于路径的定义和文件的命名的说明:templates是项目原来的html文件的目录,search是在其下新建的,名称一定,indexes名称也一定,goods是应用的名称,goodssku_text.txt 就是需要进行索引的模型类名的小写 + "_" + 索引类中定义的字段名称(text) + ".txt" )

具体在templates/search/indexes/goods/goods_text.txt文件中定义

{{ object.name }}
{{ object.caption }}
{{ object.id }}

此模板指明当将关键词通过text参数名传递时,可以通过sku的name、caption、id来进行关键字索引查询。

6 手动生成初始索引  

python manage.py rebuild_index

7.创建haystack序列化器:(返回查询到的查询集数据)

goods/serializers.py

from rest_framework import serializers
from .models import SKU class SKUSerializer(serializers.ModelSerializer):
"""
SKU序列化器
""" class Meta:
model = SKU
fields = ('id', 'name', 'price', 'default_image_url', 'comments') from drf_haystack.serializers import HaystackSerializer
from .search_indexes import SKUIndex class SKUIndexSerializer(HaystackSerializer):
"""
SKU索引结果数据序列化器
"""
object = SKUSerializer(read_only=True) class Meta:
index_classes = [SKUIndex]
# text 由索引类进行返回, object 由序列化类进行返回,第一个参数必须是text
fields = (
'text', # 用于接收查询关键字
'object', # 用于返回查询结果
'id',
'name',
'price'
)

注意:fields属性的字段名与DemoIndex类的字段对应。

8  创建视图

goods/views.py

from drf_haystack.viewsets import HaystackViewSet
from .serializers import SKUIndexSerializer
from .models import SKU class SKUSearchViewSet(HaystackViewSet):
"""
SKU搜索
"""
index_models = [SKU] serializer_class = SKUIndexSerializer

这里是通过父类默认的方法进行返回了数据, 可以在视图中对数据进行筛选和处理,详细的使用方法可以去查看官方文档,drf-haystack官方文档:https://drf-haystack.readthedocs.io/en/latest/

注意:
  • 该视图会返回搜索结果的列表数据,所以如果可以为视图增加REST framework的分页功能。
  • 我们在实现商品列表页面时已经定义了全局的分页配置,所以此搜索视图会使用全局的分页配置。

9 定义路由

通过REST framework的router来定义路由

router = DefaultRouter()
router.register('skus/search', views.SKUSearchViewSet, base_name='skus_search') ... urlpatterns += router.urls

10 测试  

http://api.meiduo.site:8000/skus/search/?text=wifi

http://api.meiduo.site:8000/skus/search/?id=1

http://api.meiduo.site:8000/skus/search/?name=iphone

如果在配置完haystack并启动程序后,出现如下异常,是因为drf-haystack还没有适配最新版本的REST framework框架

可以通过修改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)

再次测试  

返回的数据举例如下:

{
"count": ,
"next": "http://api.meiduo.site:8000/skus/search/?page=2&text=%E5%8D%8E",
"previous": null,
"results": [
{
"text": "华为 HUAWEI P10 Plus 6GB+64GB 钻雕金 移动联通电信4G手机 双卡双待\nwifi双天线设计!徕卡人像摄影!P10徕卡双摄拍照,低至2988元!\n9",
"id": ,
"name": "华为 HUAWEI P10 Plus 6GB+64GB 钻雕金 移动联通电信4G手机 双卡双待",
"price": "3388.00",
"default_image_url": "http://10.211.55.5:8888/group1/M00/00/02/CtM3BVrRcUeAHp9pAARfIK95am88523545",
"comments":
},
{
"text": "华为 HUAWEI P10 Plus 6GB+128GB 钻雕金 移动联通电信4G手机 双卡双待\nwifi双天线设计!徕卡人像摄影!P10徕卡双摄拍照,低至2988元!\n10",
"id": ,
"name": "华为 HUAWEI P10 Plus 6GB+128GB 钻雕金 移动联通电信4G手机 双卡双待",
"price": "3788.00",
"default_image_url": "http://10.211.55.5:8888/group1/M00/00/02/CtM3BVrRchWAMc8rAARfIK95am88158618",
"comments":
}
]
}

Django rest framework 使用haystack对接Elasticsearch的更多相关文章

  1. django使用haystack对接Elasticsearch实现商品搜索

    # 原创,转载请留言联系 前言: 在做一个商城项目的时候,需要实现商品搜索功能. 说到搜索,第一时间想到的是数据库的 select * from tb_sku where name like %苹果手 ...

  2. 用Django Rest Framework和AngularJS开始你的项目

    Reference: http://blog.csdn.net/seele52/article/details/14105445 译序:虽然本文号称是"hello world式的教程&quo ...

  3. django rest framework 项目创建

    Django Rest Framework 是一个强大且灵活的工具包,用以构建Web API 为什么要使用Rest Framework Django REST Framework可以在Django的基 ...

  4. python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)

    昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...

  5. Django REST framework 理解

    ​ Web应用模式 1 .前后端不分离:在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与厚度那的耦合度很高. 这种应用模式比较 ...

  6. 6- vue django restful framework 打造生鲜超市 -完成商品列表页(下)

    Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 商品列表页下 drf中的request和response drf对于django的 ...

  7. Django Rest Framework 简介及 初步使用

    使用Django Rest Framework之前我们要先知道,它是什么,能干什么用? Django Rest Framework 是一个强大且灵活的工具包,用以构建Web API 为什么要使用Res ...

  8. 使用django rest framework

    django 刚接触,想做一些restful api , google了一下,发现有现成的框架.Django REST framework. 对使用做下记录: 安装 从http://django-re ...

  9. 利用 Django REST framework 编写 RESTful API

    利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...

随机推荐

  1. 第6章 演示服务器和测试 - Identity Server 4 中文文档(v1.0.0)

    您可以使用您喜欢的客户端库尝试IdentityServer4.我们在demo.identityserver.io上有一个测试实例.在主页面上,您可以找到有关如何配置客户端以及如何调用API的说明. 此 ...

  2. 《CLR via C#》读书笔记(一)——CLR的执行模式

    前言 万事开头难,很早之前就想写博客记录些东西,迟迟未行动,甚是遗憾.原因诸多,大体上无非都是懒.没意志力等等.这次从自己的读书笔记开始,兴许能够有所改变. 一.CLR概念 CLR(Common La ...

  3. 程序员50题(JS版本)(二)

    程序6:用*号输出字母C的图案 console.log(' ****'); console.log(' ***'); console.log(' **'); console.log(' *'); co ...

  4. webstorm快捷键大全(亲自整理)

    Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者/*…*/ ) Shift+F6 重构-重命名 Ctrl+X 删除行 Ctrl+D 复制行 Ctrl+G 查找行 Ctrl+Shift+Up ...

  5. 纯css做幻灯片效果

    css3里面有一个@keyframes动画功能. w3c上面的例子: 可以使用它来做一个幻灯片效果. <!DOCTYPE html> <html lang="en" ...

  6. C++语法小技巧

    前言 写的很乱,各种内容都有.仅仅是为了记录一下 而且内容极其不严谨(没错,只有实践,没有理论)!请各位谨慎驾驶! 强制内联 #define Inline __inline__ __attribute ...

  7. arcgis api 3.x for js 入门开发系列十叠加 SHP 图层(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  8. 德国慕尼黑.NET俱乐部VS2019发布活动

    就在广州.NET俱乐部紧锣密鼓的准备配合VS2019发布搞一场大Party的时候,德国慕尼黑.NET俱乐部早就已经对外宣布他们将会配合VS2019发布搞两场活动,注意,是两场哦,不是一场哦. 第一场是 ...

  9. java之日志管理

    一. 为什么要使用日志 二. 常见日志框架介绍 三. Logback+SLF4J实战 四. 项目源码下载 五. 参考文章   一. 为什么要使用日志 1. 对IT安全至关重要   当您使用强大的日志管 ...

  10. WordCount

    一.Gitee地址:https://gitee.com/zjgss99/WordCount 二.项目分析: 对程序设计语言源文件统计字符数.单词数.行数,统计结果以指定格式输出到默认文件中,以及其他扩 ...