最近项目组需要对老的搜索项目进行迁移和改造,刚入职2个星期的我光荣的接受了这份工作,这也是我第一次接触Haystack和Elasticsearch,以下是记录下工作中的一些需求解决,具体haystack的玩法大家可以看查看官方文档:https://django-haystack.readthedocs.io/en/master/,查看本文默认你已经基本了解了haystack的使用,包括基本的配置和使用

       在开始之前,我还是有必要灌输几个概念:什么是ES,什么是Haystack,两者关系。

1.什么是ES?

在本文你只需要知道它是一个搜索服务器,存放着我们需要被搜索的数据,存储结构类似于我们的数据库,也可以对其记录进行curd的操作,重要的是能够进行‘分词’,同样是建立索引,数据库则需要把整个一句话作为索引,然后才能通过查询这一句话才能使用索引找到该记录,而ES通过‘分词’建立索引,可以建立多个单词索引指向同一记录,我们可以简单的键入一两个关键字就能调用索引弹出相关的信息,当然如果数据量少,就没必要使用ES了,毕竟这种情况下使用模糊查询也慢不了多少。

2.什么是Haystack?

Haystack 是以django的一个应用库,主要用来整合市场是的几大搜索后端作为django对它们操作的统一入口。

  3.两者关系?

  Haystack通过封装了各大搜索后端在python的操作库,如ES就是elasticsearch,让我们更专注于业务代码,不需要关注ES和python,django的对接。

  实战需求一: 当我在表中更新了数据,我需要手动更新ES的索引

Haystack提供了 rebuild_index 和 update_index 两种方法 在你安装了haystack后 类似于这样使用: python manager.py rebuild_index(你必须配置好了haystack在django) ,分别是重建和更新。两者都是从数据库表中同步到ES服务器,中间人就是django-Haystack,所以这两者性能用起来非常差,并不是说update比rebuild一定要快很多,更新的原理就是删除原记录将新的记录再插入一边到ES中,所以在更新索引时因为ES中索引数目大时,更新无异于rebuild。庆幸的是update_index 可以传入参数 age=x ,以某个时间字段的距离现在x小时内的记录进行更新.search_index.py文件具体设置见下图

设置好后,我们需要实现一个手动执行update_index的方法,这里使用django的call_command

实战需求二: 我手动更新是增量的时候上述是没什么问题的,现在我要做已有内容的变更

这个需求到我手上时,有过两种方案:

方案一: 找到进行差异更新的那条索引记录,使用最新的数据覆盖。

  这个方案在我翻遍了Haystack的文档后,四处找资料后,我放弃了,Haystack并没有提供这样的方法来更新某一条数据,更新并插入的动作。

   方案二: 删掉旧数据,新增新数据。

这个方案最终拿上了台面,原因,新增新数据这一步其实在上面已经完成,我们只需要找到旧数据的删掉就行。

就如何找到旧数据这点事最头疼的,对于刚学会Haystack应用层使用的我来说,我知道Haystack使用 elasticsearch库莱操作ES服务器,那具体如何操作,其实还是不清楚,我能知道的就是,在search_index里我们指定了model和检索字段名,然后一顿配置后,为我们在ES中配置了和数据库相同记录数的记录 ,但这些索引记录和数据库具体记录是如何对应得我们不得而知,于是开始翻找源码查看。

几经搜索,我们在每次更新索引的方法下面找到了这行代码:

这就是Haystack操作 python-elasticsearch进行批量插入记录的方法

分析一下每个参数: self.conn 可以猜到是一个ES的操作对象,index 则是我们建立的索引库 类似于数据库,doc_type则是类似于表的存在,默认全是modelresult request_timeout=30,这个应该是没有的,我在往ES服务器重建4万条数据是发现总是会在3万多条报request timeout 所以我在这里改了默认值为30。

主要就是prepped_docs,这个参数,你可以这么理解,这就是我们要插入的数据,但是有点不同的是,但是她包括了表的列名,也就是每一条记录都有相同的一部分,就是key值,这就类似于我们的json格式 在python-elasticsearch 是这么玩的:

一定包含的四个字段是 “_index,_type,_id,_source”

现在我们已经找到了索引在ES保存的数据结构,我们只要找到每一条记录的唯一值,然后删除就行了,目前看起来 唯一值就是_id,确实就是。

这个id的定义方式经过一番寻找:

 注释非常明了,如果没有被覆盖,使用: app名字.model名字.pk(也就是model里的id)  到此我们已经知道了这个id的定义方式,接下来我们就找到一个删除方法删除这条记录就行了

但是很遗憾,Haystack并没有这种单独的删除方法,所以我们只能通过操作最底层的 python-elasticsearch的删除方法:

到此,整个流程算是完了,

综上删除索引的代码就是以下两行,主要是找到这个id

es = Elasticsearch([host])
es.delete(index='设置的index_name', doc_type='modelresult', id=id)

纯原创,转载注明来源

  

Haystack+ES解决搜索服务的更多相关文章

  1. 从零搭建 ES 搜索服务(二)基础搜索

    一.前言 上篇介绍了 ES 的基本概念及环境搭建,本篇将结合实际需求介绍整个实现过程及核心代码. 二.安装 ES ik 分析器插件 2.1 ik 分析器简介 GitHub 地址:https://git ...

  2. 从零搭建ES搜索服务(一)基本概念及环境搭建

    一.前言 本系列文章最终目标是为了快速搭建一个简易可用的搜索服务.方案并不一定是最优,但实现难度较低. 二.背景 近期公司在重构老系统,需求是要求知识库支持全文检索. 我们知道普通的数据库 like ...

  3. #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案

    郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...

  4. SharePoint配置搜索服务和指定搜索范围

    转载:http://constforce.blog.163.com/blog/static/163881235201201211843334/ 一.配置SharePoint Foundation搜索 ...

  5. 神马小说:使用opensearch打造高性能搜索服务

    神马小说--- 使用opensearch打造高性能搜索服务 [使用背景] 神马小说是最早使用opensearch的用户,和opensearch一起成长.目前神马小说每天2亿搜索pv,1000w 用户. ...

  6. SharePoint 无法删除搜索服务应用程序

    在SharePoint的使用中,经常会遇到某些服务创建失败,某些服务删除不成功的情况.这里,我们就遇到了搜索服务创建失败,然后删除也不成功,使用管理中心的UI无法删除,PowerShell命令也无法删 ...

  7. Sharepoint 2013搜索服务配置总结(实战)

    分享人:广州华软 星尘 一. 前言 SharePoint 2013集成了Fast搜索,相对于以前版本搜索的配置有了一些改变,在安装部署Sharepoint 2013时可以选择默认创建搜索服务,但有时候 ...

  8. 踏得网互联网新技术垂直搜索服务和分享 - HTML5动效/特效/动画搜索

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/iefreer/article/details/34917729 当前主流搜索引擎在解决互联网技术创意 ...

  9. SharePoint 2010:搜索服务当前处于脱机状态

    错误 搜索服务当前处于脱机状态.请访问 SharePoint 管理中心中的"服务器上的服务"页,以验证是否启用了该服务.这也可能是由于正在移动索引器所致.   正在配置网站集搜索关 ...

随机推荐

  1. Openwrt 路由器上 安装 svn server

    Openwrt 上也可以搭建 svn 服务了,这样就不用开着 ubuntu 了,省电. 在后台打开 ssh 服务,或者使用 telnet 服务,使用 putty 登录路由器. 如下图所示,这里刷的是 ...

  2. Linux启动nginx时报错nginx: [emerg] getpwnam("nginx") failed

    编译时指定了用户而没有创建用户导致报错 解决: 查看你添加的用户是什么, [root@localhost nginx]# sbin/nginx -Vnginx version: nginx/1.10. ...

  3. Chrome调试工具常用功能

    一.打开的快捷键 windows: ctrl + shift + i/F12 1.Elements 1.选中 元素 切换至 Event… Tab可以查看这个元素绑定的事件 2.在 Element 选项 ...

  4. 【Weiss】【第03章】练习3.25:数组模拟队列

    [练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...

  5. 【TIJ4】第五章全部习题

    第五章习题 5.1 package ex0501; //[5.1]创建一个类,它包含一个未初始化的String引用.验证该引用被Java初始化成null class TestDefaultNull { ...

  6. ReentrantReadWriteLock源码探究

    ReentrantReadWriteLock实现了可重入的读锁和写锁,其中读锁是共享锁,写锁是互斥锁.与ReentrantLock类似,ReentrantReadWriteLock也提供了公平锁和非公 ...

  7. HBU-数据库第五周作业

    第五周数据库作业 注意 MySQL的数据库名.表名.列名.别名大小写规则是这样的: 1.数据库名与表名是严格区分大小写的: 2.表的别名是严格区分大小写的: 3.列名与列的别名在所有的情况下均是忽略大 ...

  8. 欢乐水杯(happy glass)中流体的一种实现!图文视频讲解 ! Cocos Creator!

    使用cocos creator v2.2.2 实现流体效果 ! 图文+视频讲解! 效果预览 实现原理 整体思路是参考论坛中的一个帖子 这款游戏中水的粘连效果在Construct3中利用图层很容易实现, ...

  9. vscode 配置c++记录

    c_cpp_properties.json { "configurations": [ { "name": "MinGW", "i ...

  10. hdu1541树状数组(降维打击)

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1541/ 题意是:在二维图上有一系列坐标,其中坐标给出的顺序是:按照y升序排序,如果y值相同则按照x升序排序.这个 ...