ElasticSearch之单值多字段查询以及multi match

news2025/1/24 17:45:45

写在前面

在这篇文章 我们看了使用dis_max查询来进行单值多字段场景下的查询,如下:

POST /blogs/_search
{
    "query": {
        "dis_max": {
            "queries": [
                {
                    "match": {
                        "title": "Brown fox"
                    }
                },
                {
                    "match": {
                        "body": "Brown fox"
                    }
                }
            ]
        }
    }
}

这里不知道你注意到没有,Brown fox我们重复写了N遍,即要查询的字段越多则重复写的次数也越多,想要解决这个问题,就可以使用本文要学习的multi_match了。

1:multi_match的三种方式

1.1:best_field

这种方式使用每个文档中字段的最高得分作为最终得分进行匹配,这和dis max query 是一样的效果,如下的查询:

DELETE blogs
PUT /blogs/_doc/1
{
  "title": "Quick brown rabbits",
  "body": "Brown rabbits are commonly seen."
}

PUT /blogs/_doc/2
{
  "title": "Keeping pets healthy",
  "body": "My quick brown fox eats rabbits on a regular basis"
}

POST /blogs/_search
{
    "query": {
        "dis_max": {
            "tie_breaker": 0, 
            "queries": [
                {
                    "match": {
                        "title": "Brown fox"
                    }
                },
                {
                    "match": {
                        "body": "Brown fox"
                    }
                }
            ]
        }
    }
}

在这里插入图片描述
同样也可以使用multi_match的best_field来实现:

POST /blogs/_search
{
    "query": {
        "multi_match": {
            "query": "Brown fox",
            "type": "best_fields",
            "fields": [
                "title",
                "body"
            ],
            "tie_breaker": 0
        }
    }
}

在这里插入图片描述

1.2:most_field

这种方式是某个文档匹配的字段越多,则得分越高,如下:

POST news/_bulk
{"index": {"_id": 1}}
{"f1":"aa", "f2": "bb"}
{"index": {"_id": 2}}
{"f1":"aa", "f2": "bb", "f3": "cc"}
{"index": {"_id": 3}}
{"f1":"aa", "f2": "bb", "f3": "cc", "f4": "dd"}

POST /news/_search
{
    "query": {
        "multi_match": {
            "query": "aa bb cc dd",
            "type": "most_fields",
            "fields": [
                "f1",
                "f2",
                "f3",
                "f4"
            ]
        }
    }
}

在这里插入图片描述
可以看到匹配的fields越多则越靠前。

其他特殊的情况分析。

  • 如果没有任何匹配的field则不会匹配返回,如下:
    在这里插入图片描述
  • 如果是field匹配的field数完全相同,且匹配的term数相同,则得分完全相同,如下:
DELETE news/

POST news/_bulk
{"index": {"_id": 1}}
{"f1":"aa", "f2": "bb"}
{"index": {"_id": 2}}
{"f1":"aa", "f2": "bb"}


POST /news/_search
{
    "query": {
        "multi_match": {
            "query": "aa bb",
            "type": "most_fields",
            "fields": [
                "f1",
                "f2",
                "f3",
                "f4"
            ]
        }
    }
}

在这里插入图片描述

  • 如果field匹配的field数完全相同,匹配的term越多,则得分越高,如下:
DELETE news/

POST news/_bulk
{"index": {"_id": 1}}
{"f1":"aa", "f2": "bb"}
{"index": {"_id": 2}}
{"f1":"aa", "f2": "aa bb"}


POST /news/_search
{
    "query": {
        "multi_match": {
            "query": "aa bb",
            "type": "most_fields",
            "fields": [
                "f1",
                "f2",
                "f3",
                "f4"
            ]
        }
    }
}

在这里插入图片描述
即匹配的field数优先,field数相同则按照总得分排优先级。

1.3:cross_field

这种匹配方式是将查询的字段作为一个整体来进行查询,每个要查询的词项都需要在文档中存在,才会匹配成功,如果是不使用multi_match的cross field的话我们也可以使用copy_to的方式,来将要查询的字段全部copy_to到同一个字段中,然后对该段进行普通的查询,如下:

DELETE news/
PUT news
{
    "mappings": {
        "properties": {
            "f1": {
                "type": "text",
                "copy_to": "f_full"
            },
            "f2": {
                "type": "text",
                "copy_to": "f_full"
            },
            "f3": {
                "type": "text",
                "copy_to": "f_full"
            }
        }
    }
}

POST news/_bulk
{"index": {"_id": 1}}
{"f1":"aa", "f2": "bb"}
{"index": {"_id": 2}}
{"f1":"aa", "f2": "bb"}
{"index": {"_id": 3}}
{"f1":"aa", "f2": "bb", "f3": "cc"}

POST /news/_search
{
    "query": {
        "match": {
            "f_full": {
                "query": "aa bb cc",
                "operator": "and"
            }
        }
    }
}

在这里插入图片描述
查询的是在f_full中包含aa,bb,cc的文档,但是copy_to的方式有一个缺点就是,会增加磁盘的负担,如果是使用cross_field可以等效的解决这个问题,如下:

DELETE news/
PUT news
{
    "mappings": {
        "properties": {
            "f1": {
                "type": "text",
                "copy_to": "f_full"
            },
            "f2": {
                "type": "text",
                "copy_to": "f_full"
            },
            "f3": {
                "type": "text",
                "copy_to": "f_full"
            }
        }
    }
}

POST news/_bulk
{"index": {"_id": 1}}
{"f1":"aa", "f2": "bb"}
{"index": {"_id": 2}}
{"f1":"aa", "f2": "bb"}
{"index": {"_id": 3}}
{"f1":"aa", "f2": "bb", "f3": "cc"}

POST /news/_search
{
    "query": {
        "multi_match": {
            "query": "aa bb cc",
            "type": "cross_fields",
            "fields": [
                "f1",
                "f2",
                "f3"
            ],
            "operator": "and"
        }
    },
    "profile": "true"
}

在这里插入图片描述
通过profile可以看到查询的方式是+(f2:aa | f3:aa | f1:aa) +(f2:bb | f3:bb | f1:bb) +(f2:cc | f3:cc | f1:cc),因为operator是and,所以同sql(f1 like '%aa%' or f2 like '%aa%' or f3 like '%aa%') and (f1 like '%bb%' or f2 like '%bb%' or f3 like '%bb%') and (f1 like '%cc%' or f2 like '%cc%' or f3 like '%cc%'),同样的如果是将operator改为or,则同sql(f1 like '%aa%' or f2 like '%aa%' or f3 like '%aa%') or (f1 like '%bb%' or f2 like '%bb%' or f3 like '%bb%') or (f1 like '%cc%' or f2 like '%cc%' or f3 like '%cc%')

写在后面

参考文章列表

ES中的Multi_match深入解读:best_fields、most_fields、cross_fields用法一览 。

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

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

相关文章

项目登录方案选型

一.Cookie + Session 登录 大家都知道,HTTP 是一种无状态的协议。无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求返回数据,但不会记录任何信息。为了解决 HTTP 无状态的问题,出现了 Cookie。Co…

Java SpringBoot 创建项目工程输出 Hello World

Java SpringBoot 创建项目工程输出 Hello World 1、新建项目 2、创建 controller 3、编写 Hello World 代码 package com.zhong.demo01.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.Res…

Sentinel微服务流量治理组件实战下

目录 Sentinel控制台介绍 实时监控 簇点链路 流控规则 限流阈值类型 流控模式 流控效果 熔断降级规则 熔断策略之慢调用比例 熔断策略之异常比例 熔断策略之异常数 热点规则 系统规则——系统自适应保护 系统规则阈值类型 授权控制规则——来源访问控制&#xf…

JAVA AQS源码深度讲解和分析

为方便理解,本文章以非公平锁ReentrantLock()为例作为突破讲解方法lock。 前置知识:JAVA AQS源码分析前置知识-CSDN博客 ReentrantLock的原理 Lock接口的实现类,基本都是通过聚合了一个队列同步器的子类完成线程访问控制的 从最简单的lock方…

2.23日学习打卡----初学Nginx(二)

2.23日学习打卡 目录: 2.23日学习打卡一. Nginx 虚拟主机虚拟主机的分类Nginx支持三种类型的虚拟主机配置Nginx虚拟主机单网卡多IP配置Nginx虚拟主机_基于域名虚拟主机配置Nginx虚拟主机基于多端口的配置4 二. Nginx 核心指令root和alias指令的区别return指令rewrite指令rewrit…

代码随想录Leetcode474. 一和零

题目&#xff1a; 代码(首刷看解析 2024年2月26日&#xff09; class Solution { public:// 二维 0 1背包int findMaxForm(vector<string>& strs, int m, int n) {// 1 二维 [i]表示 0 的个数&#xff0c;上限m; [j]表示 1 的个数&#xff0c;上限nvector<vector…

C++面试宝典第32题:零钱兑换

题目 给定不同面额的硬币coins和一个总金额amount,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,则返回-1。说明:你可以认为每种硬币的数量是无限的。 示例1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = …

Redis高可用三主三从集群部署(三种方式部署/18个节点的大集群)

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容使用宝塔面板搭建集群规划配置验证 使用docker搭建使用脚本搭建规划防火墙端口配置脚本redis.conf配置文件执行过程 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff…

HTTP 与HTTPS笔记

HTTP 80 HTTP是一个在计算机世界里专门在【两点】之间【传输】文字、图片、音频、视频等【超文本】数据的约定和规范。 HTTP状态码 1xx 提示信息&#xff0c;表示目前是协议处理的中间状态&#xff0c;还需要后续的操作&#xff1b;2xx 200 204 026 成功3xx 重定向&#xff…

动静态库的理解

其实我们平常写一些C或C的代码的时候&#xff0c;在链接过程都会用到动静态库&#xff0c;因为一些基础的代码我们是不用写的&#xff08;比如输入输出函数&#xff09;&#xff0c;我们只需要包个头文件&#xff0c;这些库和我们的编译好的代码一起链接后才会形成可执行程序 那…

当Vue项目启动后,通过IP地址方式在相同网络段的其他电脑上无法访问前端页面?

当Vue项目启动后&#xff0c;通过IP地址方式在相同网络段的其他电脑上无法访问前端页面&#xff0c;可能是由以下几个原因造成的&#xff1a; 服务监听地址&#xff1a;默认情况下&#xff0c;许多开发服务器&#xff08;如Vue CLI的vue-cli-service serve&#xff09;只监听lo…

opencv图像腐蚀

腐蚀&#xff08;Erosion&#xff09;是一种形态学图像处理操作&#xff0c;用于移除图像中的小白点、细小物体或者边缘。它通过将结构元素应用于图像上的像素来实现。 以下是opencv实现图像腐蚀的代码 #include <opencv2/highgui/highgui.hpp> #include <opencv2/im…

有适合短视频剪辑软件的吗?分享4款热门软件!

在数字时代&#xff0c;短视频已成为人们获取信息、娱乐消遣的重要形式。随着短视频行业的蓬勃发展&#xff0c;市场上涌现出众多短视频剪辑软件&#xff0c;它们功能各异&#xff0c;各具特色。本文将为您详细介绍几款热门短视频剪辑软件&#xff0c;助您轻松掌握短视频剪辑技…

IP对讲终端SV-6002(防水)

SV-6002&#xff08;防水&#xff09;是一款IP对讲终端&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;解码后播放&#xff0c;外部DC12~24V电源供电端子&#xff0c;提供单路2W的音频输出。基于TCP/IP网络通信协议和数字音频技术&#xff0c;…

Airtest-Selenium实操小课③:下载可爱猫猫图片

1. 前言 那么这周我们看看如何实现使用Airtest-Selenium实现自动搜索下载可爱的猫猫图片吧~ 2. 需求分析和准备 整体的需求大致可以分为以下步骤&#xff1a; 打开chrome浏览器 打开百度网页 搜索“可爱猫猫图片” 定位图片元素 创建存储图片的文件夹 下载可爱猫猫图片…

2024最新互联网大厂面试题,(java,python,vue)

最近又赶上跳槽的高峰期&#xff0c;好多粉丝&#xff0c;都问我要有没有最新面试题&#xff0c;索性&#xff0c;我就把我看过的和我面试中的真题&#xff0c;及答案都整理好&#xff0c;整理了《第3版&#xff1a;互联网大厂面试题》并分类150份 PDF&#xff0c;累计 7701页&…

消息中间件篇之Kafka-高可用机制

一、 集群模式 1. Kafka的服务器端由被称为Broker的服务进程构成&#xff0c;即一个Kafka集群由多个Broker组成。 2. 这样如果集群中某一台机器宕机&#xff0c;其他机器上的 Broker 也依然能够对外提供服务。这其实就是 Kafka 提供高可用的手段之一。 二、分区备份机制 1. 一个…

centos升级g++.v6.1.0版本

1.下载源码包 wget http://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.gz tar -zxvf gcc-6.1.0.tar.gz cd gcc-6.1.0 2.打开 download_prerequisites 脚本 vim contrib/download_prerequisites 可以看到该文件就是执行一些下载指令&#xff0c;需要下载几个包&#xff0c…

H5 个人引导页隐藏特效源码

H5 个人引导页隐藏特效源码 源码介绍&#xff1a;源码无后台、无数据库&#xff0c;H5自适应、无加密&#xff0c;直接修改可用。 源码可跳转五个选项、带隐藏特效开关&#xff0c;可随时开关特效、带微信|支付宝|QQ二维码、带行星飘落特效、带背景音乐 下载地址&#xff1a;…

实战 vue3 使用百度编辑器ueditor

前言 在开发项目由于需求vue自带对编辑器不能满足使用&#xff0c;所以改为百度编辑器&#xff0c;但是在网上搜索发现都讲得非常乱&#xff0c;所以写一篇使用流程的文章 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、下载ueditor编辑器 一个“…