基于Elasticsearch的多文档检索 比如 商品(goods)、案例(cases)

news2024/7/6 18:16:27

概述

Elasticsearch多文档聚合检索

详细

记得把这几点描述好咯:需求(要做什么) + 代码实现过程 + 项目文件结构截图 + 演示效果

应用场景

我们需要在五种不同的文档中检索数据。
比如 商品(goods)、案例(cases)、日记(diaries)、帖子(posts)、商家(shops)。
我们现在需要用关键字做全文检索,但是命中结果需要包含每一类数据。
goods->如果关键字命中,最多返回4条,不命中返回0条。
cases、diaries、posts、shops 4类数据都遵循上诉规则,就是每一类最多返回4条,没有关键词命中,则不返回。

1.分开检索每一类索引文档

为了赶工期,由于业务场景中,有单类索引检索的需求,所以一开始,我们重用了单索引的code,直接在接口层聚合5类数据。但是这样我们搜索服务与应用服务的开销无疑是增大了很多。我们来看看接口调用:
 


看到这儿,是不是有些难受。这么多调用,这么多并发,只想说一句,难受啊。是的,我心里也很难受,所以我们必须做出改变

2.一起来优化优化吧

不应该访问这么多服务,我们知道ES是可以一次性检索多类文档。我们当然希望,一次让ES返回我们所有的检索数据,那当然是最好的。我们来看看简化后的流程:
 


哟西,好像简洁了很多

3.把任务一次性交给Elasticsearch

优化之后的请求,少了服务的多次调用,少了并发的开销,我们把所有大部分任务一次性交给了SE(search engine),通过SE的计算,我们只需要一次调用服务,就可以拿到想要的所有数据,进行数据的分类封装,就可以返回给客户端使用了。那么这个过程又发生了哪些变化呢?在coding过程中,用到了哪些知识呢?下面我们一起来code share吧。

4.通过聚合函数平均返回值

要点:
terms aggregation — Bucket aggregation
topHints aggregation — Metrics aggregation

terms aggregation是Elasticsearch的Bucket aggregation,就是聚合桶;topHints aggregation 是Elasticsearch Metrics aggregation ,指标聚合。
terms aggregation — 提供根据某个字段进行装桶,可以认为是根据指定key进行分组。桶聚合的特点,只能返回桶的数据。比如:根据”_index”分组,那我们聚合桶就只有_index的值,而不能拿到命中的数据。
topHints aggregation — 返回排序靠前的数据,值得注意的是,支持返回最大的size 是 200。指标聚合,会根据桶内的数据进行指标计算。topHint 可以让我们拿到命中的数据。
说明:在这里介绍下metrics aggregation 、Bucket Aggregation的区别。metrics Aggregation 是对聚合数据的计算。Bucket Aggregation 用于对数据进行分组。往往我们在业务实现中,DSL中是需要有多种类型的aggregation的。
根据topHints aggregation 的特点,我们利用这样的方法检索,每类数据返回结果是不能超过200条的

5.code share

核心代码:
 


**aggregationBuilder 语义说明:

1.创建名称为 “index-group”的terms bucket
2.然后在每个terms bucket中创建名称为”details”的 topHints aggregation的子聚合。
3.子聚合中根据”_score”(命中分数),进行排序。

项目结构补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1005545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汇编程序设计MOOC精选题

一、微型计算机基础 1.微型计算机各部件之间是用(系统总线)连接起来的 2.冯诺依曼结构确定计算机的五个基本部件:i/o,存储器、控制器和(运算器) 微处理器通过(数据)总线 向存储器和…

java程序处理三张表要进行怎么样的操作

首先第一步梳理思路,id没有存在说明是新添加的,如果id存在那就是对现有文章的修改。 /*** 发布文章或保存草稿** param dto* return*/Overridepublic ResponseResult submitNews(WmNewsDto dto) {//0.条件判断if(dto null||dto.getContent() null){ret…

CKA 真题练习(十六)备份还原etcd

题目: 首先,为运行在 https://11.0.1.111:2379 上的现有 etcd 实例创建快照并将快照保存到 /var/lib/backup/etcd-snapshot.db (注意,真实考试中,这里写的是 https://127.0.0.1:2379) 为给定实例创建快照预计能在几秒钟内完成。 …

Java 时间范围

前端使用Element-ui 时间范围组件 后端注意在Vo里面时间设置String类型不要设置Date类型 XMl组件字段映射成功性

【基于Cocos Creator实现的赛车游戏】9.实现汽车节点的控制逻辑

转载知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具 项目地址:赛车小游戏-基于Cocos Creator 3.5版本实现: 课程的源码,基于Cocos Creator 3.5版本实现 在上一节的课程中,您已经实现了通过触控给刚体施…

LIO-SAM论文与代码总结

看了一些注释版的代码和博客,很多都很详细,但是有的看起来比较绕,或者对一些名词和定义的解释有歧义,不一定就说错了,但是仍然不方便自己理解,所以自己梳理一下,顺便记录。 目录 原文附带架构…

js 小数相乘后,精度缺失问题,记录四舍五入,向下取整

在做项目的时候,有一个计算金额的,结果发现计算的金额总是缺失0.01,发现相乘的时候,会失去精度,如图所示。被这整的吐血,由于计算逻辑由前端计算,所以传值后端总出错(尽量后端计算)。 还发现to…

React Native 环境配置(mac)

React Native 环境配置(mac) 1.Homebrew2.Node.js、WatchMan3.Yarn4.Android环境配置1.安装JDK2.下载AndroidStudio1.国内配置 Http Proxy2.安装SDK1.首先配置sdk的路径2.SDK 下载 3.创建模拟器4.配置 ANDROID_HOME 环境变量 5.IOS环境1.升级ruby&#x…

SQL8 查找某个年龄段的用户信息

描述 题目:现在运营想要针对20岁及以上且23岁及以下的用户开展分析,请你取出满足条件的设备ID、性别、年龄。 用户信息表:user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543…

神经网络 06(优化方法)

一、优化方法 网络搭建好,损失函数设计好之后, 根据损失函数更新参数(权重,偏移)。参数更新过程就是一个神经网络优化过程。 二、梯度下降方法 梯度下降法简单来说就是一种寻找使损失函数最小化的方法。从数学上的角度来看,梯度…

仿东郊到家app系统及功能介绍

类似东郊到家app系统开发,预约sap东郊到家软件定制开发,东郊到家小程序APP开发,东郊到家模式系统定制开发 一、东郊到家软件介绍 1、东郊到家app是一家以推拿为主项,个人定制型的o2o平台,东郊到家app平台提供、正规、安…

计算即时订单比例-首单使用开窗函数row_number()

1 需求 即时订单和计划订单 订单配送中,如果期望配送日期和下单日期相同,称为即时订单,如果期望配送日期和下单日期不同,称为计划订单。 请从配送信息表(delivery_info)中求出每个用户的首单(用…

langchain主要模块(一):模型输入输出

langchain2之模型输入输出 langchain1.概念2.主要模块模型输入/输出 (Model I/O)数据连接 (Data connection)链式组装 (Chains)代理 (Agents)内存 (Memory)回调 (Callbacks) 3.模型输入/输出 (Model I/O)提示提示模板示例选择器 模型LLMsChatModels 输出解释器 langchain 1.概…

计算机竞赛 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习多目标跟踪 …

opencv(python)视频按帧切片/cv2.VideoCapture()用法

一、介绍 cv2.VideoCapture是OpenCV中一个用于捕捉视频的类。它可以访问计算机的摄像头,或从视频文件中读取图像。通过cv2.VideoCapture,用户可以轻松地捕捉、保存、编辑和传输视频流数据。 使用cv2.VideoCapture可以实现以下功能: 1. 打开…

基于微信小程序的自习室系统设计与实现,可作为毕业设计

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 需求分析3.1用户需求分析3.1.1 学生用户3.1.3 管理员用户 4 数据库设计4.4.1 E…

linux————ansible

一、认识自动化运维 自动化运维: 将日常IT运维中大量的重复性工作,小到简单的日常检查、配置变更和软件安装,大到整个变更流程的组织调度,由过去的手工执行转为自动化操作,从而减少乃至消除运维中的延迟,实现“零延时”…

Could not find artifact com.mysql:mysql-connector-j:pom:unknown

在 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope> </dependency> 添加版本号 这里用的是8.0.33版本&#xff0c;输入5.0的版本依然会报错 我自身用的是5.0…

做期权卖方有资金限制吗?

做期权卖方一般是有经济实力的自然人或机构做的&#xff0c;而且必须开立保证金账户&#xff0c;万一买方要行权就会有较高的风险&#xff0c;当然&#xff0c;做期权卖方在交易方面对经验和行情的预判是有一定要求的&#xff0c;下文介绍做期权卖方有资金限制吗&#xff1f; 一…

TCP服务器使用多路复用

启用复用的作用&#xff1f; 解决linux系统中的io阻塞问题&#xff0c;让多个阻塞io接口可以一起执行。无需开启线程&#xff0c;节省系统资源。 linux系统中的阻塞io有哪些&#xff1f; scanf、read管道、eadTcp套接字、acppet接收连接请求 有以下两种方式实现多路复用&am…