1,# 从仓库拉取镜像
$ sudo docker image pull delron/elasticsearch-ik:2.4.6-1.0
2,下载elasticsearc-2.4.6目录拷贝到home目录下。
修改/home/python/elasticsearc-2.4.6/config/elasticsearch.yml第54行。
更改 ip 地址为本机真实 ip 地址。
3,使用docker运行Elasticsearch
sudo docker run -dti --name=elasticsearch --network=host -v /home/python/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0
4,
$ pip install django-haystack
$ pip install elasticsearch==2.4.1

5.Haystack 注册应用和路由 (settings配置文件中)
INSTALLED_APPS = [
# 全文检索
'haystack',
]
# Haystack 注册
url(r'^search/', include('haystack.urls')),

6,在配置文件中配置 Haystack 为搜索引擎后端
# Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://172.16.238.128:9200/', # Elasticsearch服务器ip地址,端口号固定为9200
'INDEX_NAME': 'meiduo_mall', # Elasticsearch建立的索引库的名称
},
}
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor

7,Haystack 建立数据索引
1.创建索引类

通过创建索引类,来指明让搜索引擎对哪些字段建立索引,也就是可以通过哪些字段的关键字来检索数据。
本项目中对 SKU 信息进行全文检索,所以在 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)

索引类 SKUIndex 说明:
在 SKUIndex 建立的字段,都可以借助 Haystack 由 Elasticsearch 搜索引擎查询。
其中 text 字段我们声明为 document=True,表名该字段是主要进行关键字查询的字段。
text字段的索引值可以由多个数据库模型类字段组成,具体由哪些模型类字段组成,我们用 use_template=True 表示后续通过模板来指明。

2.创建 text 字段索引值模板文件
在 templates 目录中创建 text 字段使用的模板文件
具体在 templates/search/indexes/goods/sku_text.txt 文件中定义
{{ object.id }}
{{ object.name }}
{{ object.caption }}
模板文件说明:当将关键词通过text参数名传递时
此模板指明 SKU 的id、name、caption作为text字段的索引值来进行关键字索引查询。

8,手动生成索引
python manage.py rebuild_index

9,测试索引
.准备测试表单
请求方法:GET
请求地址:/search/
请求参数:q
在 goods.views.py 文件中添加如下代码:

class MySearchView(SearchView):
'''重写SearchView类'''
def create_response(self):
page = self.request.GET.get('page')
# 获取搜索结果
context = self.get_context()
data_list = []
for sku in context['page'].object_list:
data_list.append({
'id':sku.object.id,
'name':sku.object.name,
'price':sku.object.price,
'default_image_url':sku.object.default_image_url,
'searchkey':context.get('query'),
'page_size':context['page'].paginator.num_pages,
'count':context['page'].paginator.count
})
# 拼接参数, 返回
return http.JsonResponse(data_list, safe=False)

路由配置,没有as_view()
url(r'^search/$', views.MySearchView()),

# 可以在 dev.py 中添加如下代码, 用于决定每页显示数据条数:
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5

elasticsearch 索引的使用(配合haystack)的更多相关文章

  1. Elasticsearch索引(company)_Centos下CURL增删改

    目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 1.Elasticsearch索引说明 a. 通过上面几篇博客已经将Elastics ...

  2. ES3:ElasticSearch 索引

    ElasticSearch是文档型数据库,索引(Index)定义了文档的逻辑存储和字段类型,每个索引可以包含多个文档类型,文档类型是文档的集合,文档以索引定义的逻辑存储模型,比如,指定分片和副本的数量 ...

  3. Elasticsearch索引和文档操作

    列出所有索引 现在来看看我们的索引 GET /_cat/indices?v 响应 health status index uuid pri rep docs.count docs.deleted st ...

  4. Elasticsearch索引原理

    转载 http://blog.csdn.net/endlu/article/details/51720299 最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计 ...

  5. ElasticSearch 索引 剖析

    ElasticSearch index 剖析 在看ElasticSearch权威指南基础入门中关于:分片内部原理这一小节内容后,大致对ElasticSearch的索引.搜索底层实现有了一个初步的认识. ...

  6. Elasticsearch 索引、更新、删除文档

    一.Elasticsearch 索引(新建)一个文档的命令: curl XPUT ' http://localhost:9200/test_es_order_index/test_es_order_t ...

  7. Elasticsearch 索引的全量/增量更新

    Elasticsearch 索引的全量/增量更新 当你的es 索引数据从mysql 全量导入之后,如何根据其他客户端改变索引数据源带来的变动来更新 es 索引数据呢. 首先用 Python 全量生成 ...

  8. ElasticSearch 索引模块——全文检索

    curl -XPOST http://master:9200/djt/user/3/_update -d '{"doc":{"name":"我们是中国 ...

  9. Elasticsearch索引按月划分以及获取所有索引数据

    项目中数据库根据月份水平划分,由于没有用数据库中间件,没办法一下查询所有订单信息,所有用Elasticsearch做订单检索. Elasticsearch索引和数据库分片同步,也是根据月份来建立索引. ...

随机推荐

  1. java 初学 :求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字。几个 数相加由键盘控制。

    import java.util.Scanner; public static void main(String[] args) {       Scanner input=new Scanner(S ...

  2. LeetCode 1291. 顺次数

    地址 https://leetcode-cn.com/problems/sequential-digits/submissions/ 题目描述我们定义「顺次数」为:每一位上的数字都比前一位上的数字大 ...

  3. Java入门系列之集合LinkedList源码分析(九)

    前言 上一节我们手写实现了单链表和双链表,本节我们来看看源码是如何实现的并且对比手动实现有哪些可优化的地方. LinkedList源码分析 通过上一节我们对双链表原理的讲解,同时我们对照如下图也可知道 ...

  4. Mysql高手系列,连载中

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 第1篇:mysql基础知识 第2篇:详解mys ...

  5. 易优CMS:if的基础用法

    [基础用法] 名称:if 功能:条件判断,比switch判断标签更灵活些,视个人习惯而用. 语法: {eyou:if condition='($eyou.field.has_children > ...

  6. GO基础之切片

    一.什么是切片 Go语言切片是对数组的抽象. Go数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"): 与数组相比切 ...

  7. 网络协议 2 - IP 地址和 MAC 地址

    了解完网络协议,我们会发现,网络通信的五层模型里,有两个很重要的概念:IP 地址和 MAC 地址. 那么 IP 地址是怎么来的,又是怎么没的?MAC 地址与 IP 地址又有什么区别? 这回答上面问题前 ...

  8. [转]How to mouse hover using Blue prism on a web page

    本文转自:https://stackoverflow.com/questions/53126436/how-to-mouse-hover-using-blue-prism-on-a-web-page/ ...

  9. viewPager作为RecyclerView的itemView出现的显示问题

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/174 ViewPager作为RecyclerView的it ...

  10. 多线程之NSOpertionQueue操作队列

    //NSOpertionQueue NSOperation //Queue //主队列 和 自定义队列 //主队列是运行在主线程当中,自定义队列运行在后台 //NSOperation 定义需要执行的操 ...