Elasticsearch复合查询之Boosting Query
前言
ES 里面有 5 种复合查询,分别是:
- Boolean Query
- Boosting Query
- Constant Score Query
- Disjunction Max Query
- Function Score Query
Boolean Query在之前已经介绍过了,今天来看一下 Boosting Query 用法,其实也非常简单,总结起来就一句话,对不期待的查询关键词进行相关性降分。
Boost 加权机制底层也是 Lucene 提供的能力,对重要的数据加权有两个时机,一个是在索引时,一个是在查询时,在索引时候加权查询性能会比较高但不灵活,所以都会选择在查询时加权,加权的方式也很简单,如:
title: china^20 OR content: china^20
在 ES里面的大多数全文检索 单 Query 都支持 boost 加权,但想要实现降权却不行,因为 Lucene 底层不直接支持,需要使用 function score query来间接实现,boost 的数值必须是正数,当然也可以包括 0-1 之间的小数,所以在 ES 中就封装了 Boosting Query 来支持对某些关键词进行降权查询,却又不是不让其出现在查询结果中,只是让其排名靠后
写入测试数据
在 kibana 中的 dev_tools 的 console 中,直接使用下面的 POST 语句即可,需要注意,如果 ES
版本低于 7.x 的,在 PATH 里面要加上 type,否则会报错:
POST test01/doc/_bulk
{ "index" : { "_id" : "1" } }
{ "title" : "Collecting Service", "content": "Logstash" }
{ "index" : { "_id" : "2" } }
{ "title" : "Collecting Service", "content": "Beats" }
{ "index" : { "_id" : "3" } }
{ "title" : "Collecting Service", "content": "FLume" }
写完之后,可以在 Management => Index patterns => Create Index Patterns 里面创建手动创建索引模板,可以看到生成了如下 mapping,需要注意的时,这里面自动推断的 mapping 字段并不能删减字段,因为我们是已经
将数据写入了 ES,如果想要控制字段的生成,比如不想要 content.keyword 字段,那么就要在写入数据前,提前定制 mapping 才可以

查询测试数据
GET test01/_search?
{"query": {"match": {"title": "Collecting"}}
}
返回结果:
{"took" : 2,"timed_out" : false,"_shards" : {"total" : 6,"successful" : 6,"skipped" : 0,"failed" : 0},"hits" : {"total" : 3,"max_score" : 0.2876821,"hits" : [{"_index" : "test01","_type" : "doc","_id" : "3","_score" : 0.2876821,"_source" : {"title" : "Collecting Service","content" : "FLume"}},{"_index" : "test01","_type" : "doc","_id" : "2","_score" : 0.2876821,"_source" : {"title" : "Collecting Service","content" : "Beats"}},{"_index" : "test01","_type" : "doc","_id" : "1","_score" : 0.2876821,"_source" : {"title" : "Collecting Service","content" : "Logstash"}}]}
}
可以看到评分都相等,这个时候如果我想要命中 logstash 的不优先展示,就可以使用 Boosting Query 了:
GET test01/_search?
{"query": {"boosting": {"positive": {"match": {"title": "Collecting Service"}},"negative": {"match": {"content": "Logstash"}},"negative_boost": 0.5}}
}
结果展示:
{"took" : 2,"timed_out" : false,"_shards" : {"total" : 6,"successful" : 6,"skipped" : 0,"failed" : 0},"hits" : {"total" : 3,"max_score" : 0.5753642,"hits" : [{"_index" : "test01","_type" : "doc","_id" : "3","_score" : 0.5753642,"_source" : {"title" : "Collecting Service","content" : "FLume"}},{"_index" : "test01","_type" : "doc","_id" : "2","_score" : 0.5753642,"_source" : {"title" : "Collecting Service","content" : "Beats"}},{"_index" : "test01","_type" : "doc","_id" : "1","_score" : 0.2876821,"_source" : {"title" : "Collecting Service","content" : "Logstash"}}]}
}
Boosting Query原理
Positive Boosting:
这种形式用于增强具有特定条件的文档的得分。它由两个子查询组成:主查询(positive query)和副查询(boost query)。主查询用于匹配文档,而副查询用于对匹配到的文档进行权重调整。Boosting Query将副查询的分数与主查询的分数相乘,从而影响文档的最终得分。
Negative Boosting:
这种形式用于降低具有特定条件的文档的得分。它同样由两个子查询组成:主查询和副查询。在Negative Boosting中,主查询用于匹配文档,而副查询用于对不匹配的文档进行权重调整。Boosting Query将副查询的分数与主查询的分数相乘,并将结果从1中减去,以降低不匹配文档的得分。
Boosting Query的实现原理如下:
- 解析查询语句:Elasticsearch首先解析用户提供的Boosting Query语句,提取出主查询和副查询以及相应的权重。
- 执行查询:对索引中的文档进行主查询匹配,并为匹配到的文档计算得分。
- 计算副查询得分:对于每个匹配到的文档,执行副查询,并计算副查询的得分。
- 应用权重调整:根据Boosting Query的类型(Positive Boosting或Negative Boosting),将副查询的得分与主查询的得分相乘,或者从1中减去,从而调整文档的最终得分。
- 返回结果:根据得分对匹配的文档进行排序,将搜索结果返回给用户。
相关文章:
Elasticsearch复合查询之Boosting Query
前言 ES 里面有 5 种复合查询,分别是: Boolean QueryBoosting QueryConstant Score QueryDisjunction Max QueryFunction Score Query Boolean Query在之前已经介绍过了,今天来看一下 Boosting Query 用法,其实也非常简单&…...
Clickhouse基于文件复制写入
背景 目前clickhouse社区对于数据的写入主要基于文件本地表、分布式表方式为主,但缺乏大批量快速写入场景下的数据写入方式,本文提供了一种基于clickhouse local 客户端工具分布式处理hdfs数据表文件,并将clickhouse以文件复制的方式完成写入…...
梅赛德斯-奔驰将成为首家集成ChatGPT的汽车制造商
ChatGPT的受欢迎程度毋庸置疑。OpenAI这个基于人工智能的工具,每天能够吸引无数用户使用,已成为当下很受欢迎的技术热点。因此,有许多公司都在想方设法利用ChatGPT来提高产品吸引力,卖点以及性能。在汽车领域,梅赛德斯…...
QT-播放原始PCM音频流
QT multimedia audioplay.h /************************************************************************* 接口描述:原始音频播放类 拟制: 接口版本:V1.0 时间:20220922 说明: ********************************…...
【杂谈】聊聊我是如何从Java转入Web3的
我先说说我基本的一个情况吧: 我是之前是一位从业了传统web2行业三年的Java开发,在2018年尾才开始去关注区块链的,之前虽然也有混迹在币圈,但是没怎么关注到币圈的内在运行逻辑。 后面因为当时元宇宙和Web3的概念特别火&a…...
ArrayList
目录 1.ArrayList简介 2.ArrayList的构造 2.1ArrayList() 2.2ArrayList(Collection c) 2.3ArrayList(int initialCapacity) 3.ArrayList常见操作 4.ArrayList的遍历的遍历 1.ArrayList简介 在集合框架中, ArrayList 是一个普通的类,实现了 List…...
不重启Docker能添加自签SSL证书镜像仓库吗?
应用背景 在企业应用Docker规划初期配置非安全镜像仓库时,有时会遗漏一些仓库没配置,但此时应用程序已经在Docker平台上部署起来了,体量越大就越不会让人去直接重启Docker。 那么,不重启Docker能添加自签SSL证书镜像仓库吗&…...
Ajax介绍
1.与服务器进行数据交换:通过 Ajax 可以给服务器发送请求,并获取服务器响应的数据。 2.异步交互:可以在 不重新加载整个页面 的情况下,与服务器交换数据并 更新部分网页 的技术,如: 搜索联想、用户名是否可…...
docker 学习--02 常用命令
docker 学习–02 常用命令 docker 学习-- 01 基础知识 docker 学习-- 03 环境安装(win10) 文章目录 docker 学习--02 常用命令1. 帮助启动类命令1.1启动docker1.2 停止docker1.3 重启docker1.4 查看docker1.5 设置开机自启1.6 查看docker概要信息1.7 查…...
socks5 保障网络安全与爬虫需求的完美融合
Socks5代理:跨足网络安全和爬虫领域的全能选手 Socks5代理作为一种通用的网络协议,为多种应用场景提供了强大的代理能力。它不仅支持TCP和UDP的数据传输,还具备更高级的安全特性,如用户身份验证和加密通信。在网络安全中…...
构建智能医疗未来:人工智能在线上问诊系统开发中的应用
随着人工智能技术的飞速发展,医疗领域也正在逐步迎来一场革命性的变革。其中,人工智能在在线上问诊系统开发中的应用,正为医疗产业带来全新的可能性。本文将深入探讨如何利用代码构建智能医疗未来,以提升线上问诊系统的效率、准确…...
css3-grid:grid 布局 / 基础使用
一、理解 grid 二、理解 css grid 布局 CSS Grid布局是一个二维的布局系统,它允许我们通过定义网格和网格中每个元素的位置和尺寸来进行页面布局。CSS Grid是一个非常强大的布局系统,它不仅可以用于构建网格布局,还可以用于定位元素…...
如何在windows电脑安装多个tomcat服务器和乱码问题
前提条件安装jdk 以17版本为例,将jdk8卸载干净 1.首先进入tomcat官网下载 tomcat网址 这里下载tomcat10为例子 1.1 这里选择方式一 下载解压版 2.解压后拷贝三份 分别命名为 8081、 8082、 8083 3.分别对每个tomcat执行以下操作 3.1 找到tomcat所在webapps文…...
flutter:webview_flutter的简单使用
前言 最近在研究如何在应用程序中嵌入Web视图,发现有两个库不错。 一个是官方维护、一个是第三方维护。因为没说特别的需求,就使用了官方库,实现一些简单功能是完全ok的 基本使用 官方文档 https://pub-web.flutter-io.cn/packages/webv…...
Ansys Zemax | 手机镜头设计 - 第 1 部分:光学设计
本文是 3 篇系列文章的一部分,该系列文章将讨论智能手机镜头模组设计的挑战,从概念、设计到制造和结构变形的分析。本文是三部分系列的第一部分,将专注于OpticStudio中镜头模组的设计、分析和可制造性评估。(联系我们获取文章附件…...
jvm从入门到精通
jvm 1.jvm与java体系结构...
[NLP]LLM 训练时GPU显存耗用量估计
以LLM中最常见的Adam fp16混合精度训练为例,分析其显存占用有以下四个部分: GPT-2含有1.5B个参数,如果用fp16格式,只需要1.5G*2Byte3GB显存, 但是模型状态实际上需要耗费1.5B*1624GB. 比如说有一个模型参数量是1M,在…...
Unity引擎使用InteriorCubeMap采样制作假室内效果
Unity引擎制作假室内效果 大家好,我是阿赵。 这次来介绍一种使用CubeMap做假室内效果的方式。这种技术名叫InteriorCubeMap,是UE引擎自带的节点效果。我这里是在Unity引擎里面的实现。 一、效果展示 这个假室内效果,要动态看才能看出效…...
Gin安装解决国内go 与 热加载
get 方式安装超时问题,国内直接用官网推荐的下面这个命令大概率是安装不成功的 go get -u github.com/gin-gonic/gin 可以在你的项目目录下执行下面几个命令: 比如我的项目在E:\Oproject\zl cmd E:\Oproject\zl>就在目录下执行 go env -w GO111…...
安防监控视频云存储平台EasyCVRH.265转码功能更新:新增分辨率配置
安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求,让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上,视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
