最近项目组需要对老的搜索项目进行迁移和改造, 刚入职 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 小时内的记录进行更新. 具体设置见下图
设置好后, 我们需要实现一个手动执行 rebuild_update 的方法, 使用 django 的 call_command
来源: https://www.cnblogs.com/z-gh/p/10272875.html