ElasticSearch复合查寻

devtools/2024/9/25 7:46:29/

        FunctionScore主要是在原始查询的基础上去修改一下算分的。

        而BooleanQuery布尔查询,它不会去修改算分,而是把多个查询语句组合在一起形成新查询。这些被组合的查询语句,我们都称之为叫子查询了,这些子查询,它的组合方式有下面四种,分别是:

                        

        ·Must:必须、必须成立,必须匹配  比如说你有两到三个字查询,每个都要成立

        ·should 选择性匹配。比方说你有两个或三个子查询,只要任意匹配一个就行了

        ·must_not 相反,不能成立

        ·filter,从字面来看,它也是必须匹配,Must也是必须匹配,确实它俩都是必须匹配,都是”与”的意思。

         must not和filter不参与算分

         must not和filter不参与算分它们在做搜索过滤时不参与算分。大家都知道ES在做搜索的时候,它不仅仅是判断你这个文档是否匹配,它还要看你这个文档跟关键字之间的相关度,给你打个分儿,分最高要靠前,这个打分我们有非常复杂的一个算分函数BM25;因此每做一次算分,其实是会消耗一些资源的。如果子查询比较多,每一个都参与算分,是不是查询性能就会受到影响,而如果你在使用的时候,你用的是filter查询和must not查询,它们是不参与算分的。

        虽然BooleanQuery复合查询里面有这么四种组合关系,但是除了跟算分相关的,一般就是关键字:用户输入的个关键字,除了用户输入的个关键字以外,剩下的过滤条件都应该放在must_not 或者filter里边,尽可能的减少算分,提高查询的效率。

        用户输入的关键字,其实你可以放到Must里,因为他要参与算分,

        但是下边这些过滤条件品牌也好,价格也,最好放到 must not或者filter当中。因为放到must_not或者filter里,不存算分,性能更好:

举例子: 

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​ must not和filter不参与算分:

放到must里面:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​         

must参与算分,现在我的must里边就有两个条件了,我们来再运行一次,结果依然是三条。同样还是刚才的这几个,但是让大家看算分是不是变了,变成二点多分了,刚才是不是一点几分

如果说你再把must_not也加进去,算分还是会受影响:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

 所以放到must里面的,或者是should里面的,都会影响算分,都会参与算分。

参与算分的条件越多,性能就会越差,所以这些过滤条件大家一定要根据你自己的需求看是应该放在哪里合适


http://www.ppmy.cn/devtools/23609.html

相关文章

如何制作一个后台管理页面的路由以及功能实现

后台 文章目录 后台一、RESFUL API二、各模块路由处理1、分类模块1.1、GET /list 分类列表1.2、POST / 新增|编辑分类1.3、DELETE / 删除分类1.4、GET /option 分类选项列表 2、评论模块2.1、GET /list 评论列表2.2、DELETE / 删除评论2.3、PUT /review 修改评论审核 3、留言模…

【算法模版】基础算法

文章目录 快速排序算法模板归并排序算法模板整数二分算法模板浮点数二分算法模板高精度加法、减法、乘法、除法高精度加法高精度减法高精度乘低精度高精度除以低精度前缀和与差分一维前缀和二维前缀和一维差分二维差分位运算双指针算法离散化区间合并 快速排序算法模板 快速排…

React 掌握这几个就入门了

大纲 1.如何创建和嵌套组件 2.使用 JSX 编写标签 3.如何添加样式 4.如何显示数据 5.如何渲染条件和列表 6.如何对事件做出响应并更新界面 7.如何在组件间共享数据 创建和嵌套组件 React 应用程序是由 组件 组成的。一个组件是 UI(用户界面)的一部分&…

第⑰讲:Ceph集群各组件的配置参数调整

文章目录 1.Ceph集群各组件的配置文件1.1.Ceph各组件配置方式1.2.ceph临时查看、修改配置参数的方法 2.调整Monitor组件的配置参数删除Pool资源池2.1.临时调整配置参数2.2.永久修改配置参数 1.Ceph集群各组件的配置文件 1.1.Ceph各组件配置方式 Ceph集群中各个组件的默认配置…

【MySQL】Linux环境下MySQL基本操作

目录 一、登录进入MySQL 二、MySQL数据库的查看、创建、删除、重命名、拷贝操作 三、数据库下表的创建、删除、查看、修改(增加、删除、更新字段/列,修改字段/列名) 四、表中数据的插入、删除、查找、更新 一、登录进入MySQL mysql -u u…

centos学习-掌握核心命令之-yum

引言 在CentOS系统中,yum(Yellowdog Updater Modified)是一个强大的包管理工具,用于自动从指定的远程仓库下载并安装、更新、删除软件包。yum简化了依赖关系管理,使得Linux系统的软件包管理变得非常容易。下面是对Cen…

宠物领养|基于SprinBoot+vue的宠物领养管理系统(源码+数据库+文档)

宠物领养目录 基于Spring Boot的宠物领养系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1前台 1.1 宠物领养 1.2 宠物认领 1.3 教学视频 2后台 2.1宠物领养管理 2.2 宠物领养审核管理 2.3 宠物认领管理 2.4 宠物认领审核管理 2.5 教学视频管理 四、…

Vue中嵌套路由(子路由)的使用

请注意不要把普通路由设为子路由,否则路由不会跳转的。 当你想要在一个路由的组件内部展示另一个组件,并且这个内部组件的 URL 是基于外部组件的 URL 时,才需要使用 children。 使用 children 的情况: 侧边栏或顶部导航的页面布局…