最近项目组需要对老的搜索项目进行迁移和改造,刚入职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. Flutter 日期时间DatePicker控件及国际化

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 DatePicker Flutter并没有DatePick ...

  2. Python实现对excel的操作

    1.操作excel使用第三方库openpyxl安装:pip install openpyxy引入:import openpyxl2.常用简单操作1)打开excel文件获取工作簿wb = openpyx ...

  3. 区间DP(力扣1000.合并石头的最低成本)

    一.区间DP 顾名思义区间DP就是在区间上进行动态规划,先求出一段区间上的最优解,在合并成整个大区间的最优解,方法主要有记忆化搜素和递归的形式. 顺便提一下动态规划的成立条件是满足最优子结构和无后效性 ...

  4. 为什么vue中的data用return返回呢?

    不使用return包裹的数据会在项目的全局可见,会造成变量污染:使用return包裹后数据中变量只在当前组件中生效,不会影响其他组件. 当一个组件被定义, data 必须声明为返回一个初始数据对象的函 ...

  5. 微信小程序开发(二)认识开发工具

    腾讯微信团队提供非常优秀的微信小程序开发工具,大大降低了开发者的入门门槛,为他们点赞!上一篇文章已经说明了,如何注册及下载开发工具,现在我们就来一起认识见识一下开发工具的庐山真面目. 首次打开这个开发 ...

  6. 安卓App自动化测试环境

    一.appium安装 1.nodejs依赖 2..net framework 3.Appium桌面程序安装 3.1.安装包获取 3.2.安装过程 二.Java_ jdk安装 1.Java_jdk版本说 ...

  7. Centos7配置IP地址和DNS

    目录 一.查看IP地址 1.ifconfig命令 2.ip addr命令 二.配置网卡 1.动态IP地址 2.静态IP地址 3.重启网卡 三.注意事项 四.本地虚拟机设置静态IP后不能上网的解决方法 ...

  8. Remmina

    什么是Remmina? Remmina作为一个远程连接服务器,可以方便快捷的帮你连接服务器,不用直接使用命令行的方式去连接服务器,使用也很简单.具体下载直接在APP中下载就好,Linux自带这个软件, ...

  9. [Docker02]Docker_registry

    部署Docker仓库 Docker registry #检查端口5000是否被占用 netstat -tunlp | grep 5000 # the local host ip is 172.17.0 ...

  10. 二进制补码:Why & How

    二进制补码:Why & How 学习计算机原理或者语言的底层操作难免会遇到用二进制补码表示负数的问题.由于一些书本上对于采用补码的原因没有详细解释,很多人会认为这只是一种规定,但实际上采用补码 ...