Elasticsearch 基本使用(五)查询条件匹配方式(query query_string)

news2024/9/23 1:39:07

查询条件匹配方式

    • 概述
    • query
      • term
      • terms
      • range
      • match_all
      • match
        • match 匹配精度问题
      • match_phrase
      • match_pharse_prefix
      • match_bool_prefix
      • multi_match
    • query_string
      • 简单查询一个字段
      • 在多个字段上应用同一个条件 (类似multi_match)
      • 在所有字段上应用同一个条件 (超越了multi_match)
      • 对单个条件应用多个值
        • 多个值之间可以是 AND 或者 OR 的关系
      • query_string
        • match 匹配
          • 一个字段一个值
          • 一个字段多个值
          • 多个字段一个值
          • 多个字段多个值
        • 模糊匹配(比match更强大,在match后的词里面再进行模糊匹配)
        • 范围匹配
        • query_string 不同维度之间都是可以混用的(以上只是介绍了query_string基本用法,还有很多高级特性,具体可以参考官方文档)

概述

ES中常用的查询类型往大了分可以分为简单查询,复合查询,聚合查询等;
而复合查询及聚合查询都是基于简单查询的;简单查询里面对条件的匹配方式又分为不同类型。term[s],match,match_all,match_phrase 等等

query

term

单词查询,在字段的倒排索引(发生分词)或者直接在字段值(未发生分词)中查找条件值,只要找到这个条件值就算匹配上,得分为1。

terms

多个单词查询,效果为 多个 term 或者的逻辑。bool -> should -> term1,term2…

range

一般用于对数值类型进行范围查询

match_all

无条件查询,匹配所有数据

match

  • 根据文档中实际存储的字段类型(是否为分词文本 text,keyword 不会进行分词),决定是否对条件值进行分词
  • 如果未分词,直接以条件值执行 term 查询
  • 如果分词,则对条件值进行,分词处理;
    • 若得到一个词,也是执行term查询
    • 若得到多个词,默认执行 terms 查询(多个单词 或者关系)
    • 也可以手动指定为 且关系(如果为且,意思是,倒排索引后的词表中要包含 条件分词后的 所有单词),通过以下方式指定 match 单词之间的关系
    GET /stu/_search
    {
      "query": {
        "match": {
          "name": {
            "query": "张 四",
            "operator": "and"
          }
        }
      }
    }
    
    以上查询 operator 默认为 or,分词 得到 两个词;
    可以查到 张三 李四 张三四 三个人。
    我们将 operator 指定为 and 后,只能查到 张三四 一个人了,必须包含条件分词后的所有单词。

match 匹配精度问题

对于match 分词后的查询;
and 是必须包含条件分词后所有的单词
or 是只需包含条件分词后任意一个单词。

and 下相对来说精度问题还好点,毕竟要包含所有条件分词单词。
如果是在or的情况,我们想要定义至少包含几个单词才当作匹配上,此时还需要另一个参数 minimum_should_match
虽然在and情况下,用得相对较少,但对and也有效
此值也可以设置为百分比,意思是条件分词后,达到比例的条件单词匹配上才算匹配
比如,以下查询语句是查不出数据的

GET /stu/_search
{
  "query": {
    "match": {
      "name": {
        "query": "张 四",
        "operator": "and",
        "minimum_should_match": 3
      }
    }
  }
}

因为你的条件分词,只有 2个词,即使分词也只得到2个词, 小于 minimum_should_match

match_phrase

以当前条件值,到文档**字段(而非分词后的列表)**里查询。
条件不做分词,到文档字段内 进行连续的 文本匹配

match_pharse_prefix

同样是以 条件不做分词到文档字段中查询,但是条件最后的 单词不是必须匹配字段内的完整单词
例如:
文档字段为 i love you
条件为 i love yo
match_phrase 下 无法匹配,因为 文档中 you 是一个完整的单词;只能匹配 i 或者 i love 或者 i love you
match_pharse_prefix 就可以匹配,就是说只要是一个前缀包含的连续文本就能匹配

match_bool_prefix

条件进行分词,执行 bool > should 查询
前面的词 做 term 查询,最后一个词做 perfix 查询

multi_match

在实际开发中,特别是模糊查询场景,可能需要将条件应用到多个文档字段上进行匹配。
当然我们可以使用 bool + should 的方式实现。
但ES已经给我们提供了一种更为便捷的方式。
同时匹配 品牌或名称 有苹果的数据

"query": {
    "multi_match" : {
      "query":    "苹果",
      "fields": [ "brand", "name" ] 
    }
  }

等价于

"query": {
    "bool": {
      "should": [
        {
          "match": {
            "brand": "苹果"
          }
        },
        {
          "match": {
            "name": "苹果"
          }
        }
      ]
    }
  }

query_string

以下是引用自ES社区博客中的一段描述

该查询使用语法基于 ORANDNOT 等运算符来解析和拆分提供的查询字符串。 然后查询在返回匹配文档之前独立分析每个拆分文本。
你可以使用 query_string 查询创建一个复杂的搜索,其中包括通配符跨多个字段的搜索等等。 尽管用途广泛,但查询是严格的,如果查询字符串包含任何无效语法,则返回错误。

简单总结:这是使用字符串通过 AND OR NOT 构建复杂查询的一种实现方式,但是语法较严格,容易出错,并不推荐在日常查询中使用

实际测试下来,单个条件执行的应该是match操作

简单查询一个字段

default_field:条件字段,只能一个。

GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "address",
      "query": "School Lane"
    }
  }
}

返回结果为 School Lane 的match查询,凡是 address 包含 School 或者 Lane 的都匹配上
在这里插入图片描述

在多个字段上应用同一个条件 (类似multi_match)

上面的简单查询 通过 “default_field”: “字段名” 指定一个查询字段。
当要将条件应用到多个字段时,可以使用 “fields”: [“字段1”, “字段2”],

GET /bank/_search
{
  "query": {
    "query_string": {
      "fields": ["age", "account_number"], 
      "query": "26"
    }
  }
}

查询 age match 26 或者 account_number match 26 的数据

在所有字段上应用同一个条件 (超越了multi_match)

在所有字段上执行match操作,只要任何一个字段匹配上就算匹配。
我们只需要去掉 fields 字段即可

GET /bank/_search
{
 "query": {
   "query_string": {
     "query": "28"
   }
 },
 "size": 2000
}

以上,在所有字段上应用 match 28。
在 bank 这个索引下,查到了 age = 28 和 id = 28 的数据

对单个条件应用多个值

多个值之间可以是 AND 或者 OR 的关系

  • 在所有字段上match 28 或者 30
GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "28 OR 30"
    }
  },
  "size": 2000
}

指定字段 fields 或默认字段 default_field都适用这个逻辑关系
NOT 关键字可以用在逻辑关系中任一项的前面,表示查询相反条件

query_string

上面指定字段要么使用 fields ,要么使用 default_field,其实还有另一种更为灵活的方式,我们可以直接将字段写到 query查询语句中,
使用 query:“字段名: 条件值” 的方式灵活定制查询条件

match 匹配

一个字段一个值
GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "age: 30"
    }
  },
  "size": 100
}
一个字段多个值
GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "age: 30 OR 20"
    }
  },
  "size": 100
}
多个字段一个值
GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "age: 30 OR account_number:1"
    }
  },
  "size": 100
}
多个字段多个值
GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "age: (30 OR 20) OR account_number: 1"
    }
  },
  "size": 100
}

模糊匹配(比match更强大,在match后的词里面再进行模糊匹配)

如下:
match Sedgwick

GET /bank/_search
{
  "query": {
    "match": {
      "address": "Sedgwick"
    }
  }
}

match 只能在分词后的倒排索引中精确匹配
在这里插入图片描述
如果把条件值改成 Sedgwic,去掉最后一个 k,match就查不出来数据了。

但是使用 query_string 的模糊匹配依然有办法查出来这两条数据
query_string 的模糊匹配有两个通配符

  • ?,统配一个字符,
  • *,统配任意多个字符
    使用以下语句都可以查出这两条数据
  • ?匹配一个字符 k
GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "address",
      "query": "Sedgwic?"
    }
  }
}
  • *匹配一个字符 k
GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "address",
      "query": "Sedgwic*"
    }
  }
}
  • *匹配多个字符 ck
GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "address",
      "query": "Sedgwi*"
    }
  }
}
  • 前缀也能模糊
GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "address",
      "query": "*dgwi*"
    }
  }
}

以上都能查出来那两条数据。

范围匹配

默认的匹配方式为 match,其本质就是 等值匹配,只是分不分词的区别,
对于 query 中的 range 查询,query_string 中也有对应实现。
并且 query_string 还支持两种写法

  • 区间写法
    [ 表示包含起始值
    ] 表示包含结束值
    { 不包含起始值
    } 不包含结束值
    *表示不限制这一边的值
    以下例子
    • [1 TO 2] :1 <= x <= 2
    • {1 TO 2} :1 < x < 2
    • [* TO 2] : x <= 2
      依然支持上面不同字段的写法,这里只是举个例子
GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "age",
      "query": "{* TO 20]"
    }
  }
}
GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "age:{* TO 20]"
    }
  }
}
  • 传统 > < 写法
    • “>2” 大于2
    • ">=2"大于等于2
    • “>=2 AND <=5” 大于等于2且小于等于5
      与上面那些多条件,多个值,模糊查询 不同维度之间 是可以混合使用的。
GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "age",
      "query": ">=20"
    }
  }
}

GET /bank/_search
{
  "query": {
    "query_string": {
      "default_field": "age",
      "query": ">=20 AND <30"
    }
  }
}

GET /bank/_search
{
  "query": {
    "query_string": {
      "query": "age:(>=20 AND <30)"
    }
  }
}

query_string 不同维度之间都是可以混用的(以上只是介绍了query_string基本用法,还有很多高级特性,具体可以参考官方文档)

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

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

相关文章

mysql 大数据量从“.log“文件插入方法

要被插入的数据文件以及内容 表结构 插入成功&#xff0c;插入时如果有主键唯一索引&#xff0c;则按照唯一索引的大小顺序插入&#xff0c;速度会快很多

基于Spring Boot的智能学生考勤系统设计与实现(Java+spring boot+MySQL+微信小程序+

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的智能学生考勤系统设计与实现&#xff08;Javaspring bootMySQL微信小程序人脸识别&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 后端&#xff1a;Java…

SpringBoot 如何使用 TestEntityManager 进行 JPA 集成测试, 如何使用

Spring Boot 是一个非常流行的 Java Web 开发框架&#xff0c;它简化了开发过程&#xff0c;提高了开发效率。在开发过程中&#xff0c;我们通常需要使用 JPA 操作数据库&#xff0c;为了保证代码的质量和正确性&#xff0c;我们需要进行集成测试。TestEntityManager 是 Spring…

bat批处理脚本控制台输出中文乱码问题

背景 最近在搞springcloud框架&#xff0c;涉及各种微服务。比如服务注册与发现、网关、鉴权、文件服务、日志服务、搜索服务、用户中心等等。如果要打包发布应用&#xff0c;就得一个个去打包&#xff0c;一个个去拷贝jar包&#xff0c;很繁琐。所以就想着写个bat脚本&#x…

【Zookeeper】使用Curator操作Zookeeper

简介 Curator 是 Apache ZooKeeper 的Java客户端库。 Zookeeper现有常见的Java API如&#xff1a;原生JavaAPI、Curator、ZkClient等。 添加依赖 <dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId&…

gitlab:(二)gitlab添加win10 台式机的ssh key

当前gitlab版本为12系列&#xff1a; 点击settings 找到ssh keys &#xff0c;再找到“ generate one or use an existing key.” 点击 generate one 参考如下的教程&#xff1a; window cmd 命令行示例 添加 ssh keys 添加的效果

路由基本使用

编程式导航 默认路由 模糊匹配模式 精确匹配

【C语言】指针进化 !!!

前言 &#x1f388;大家好&#xff0c;我是何小侠&#x1f388; &#x1f343;大家可以叫我小何或者小侠&#x1f343; &#x1f490;希望能通过写博客加深自己对于学习内容的理解&#x1f490; &#x1f338;也能帮助更多人理解和学习&#x1f338; 兰生幽谷&#xff0c;不为…

Redis 五种基本数据结构及基本使用

一、数据结构 二、使用 2.1 String 的使用 Redis String 一个键对应一个值&#xff0c;并且是二进制安全的&#xff0c;值可以是图片或者序列化后的对象。 一个键最大能存储 512 MB。 2.1.1 set 命令的使用 set key value127.0.0.1:6379> set name yunhu OK 127.0.0.1:…

【Docker】docker基础使用

文章目录 docker概念什么是dockerdocker引擎迭代docker与虚拟机docker版本发展 docker基础docker架构docker Registry(镜像仓库)镜像仓库使用流程实际研发镜像仓库使用不同镜像仓库的拉取 docker常用命令镜像仓库命令docker logindocker pulldocker pushdocker searchdocker lo…

Github的加速访问(解决github进不去)

1.下载Steam Steam 现更名为 Watt Toolkit 并在 Microsoft Store 中已可用 2.打开Steam 3.勾选github 一键加速

java试题1

1、哪些问题是HTTPS无法解决的&#xff1f; Http是基于TCP协议的&#xff0c;在网络层的传输耗时比较长&#xff0c;https没有解决这个问题&#xff1b;http头是不能压缩的&#xff0c;每次要传递很大的数据包&#xff0c;每个连接也只能支持一个请求。同时https应用了很多加密…

Docker - 基本概念、与虚拟机的区别、架构、镜像操作、容器操作、数据卷挂载

目录 一、对 Docker 的理解 1、Docker 基本概念 2、Docker 与 虚拟机的区别 3、何为镜像和容器&#xff1f; 4、Docker 主要架构 二、Docker 基本操作 1、Docker 镜像操作 2、案例&#xff08;镜像&#xff09;&#xff1a;去 DockerHub 搜索并拉取一个 Nginx 镜像&am…

第一百天学习记录:线性代数:行列式(宋浩板书)

n阶行列式 注&#xff1a;二阶行列式和三阶行列式以及排列和逆序数见高等数学自学向量篇中间穿插的线性代数知识点补充。 行列式的性质 性质7&#xff08;☆☆☆&#xff09; 行列式按行展开 拉普拉斯 行列式相乘 行列式的计算 Cramer法则 题外话&#…

【unity实战】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)

文章目录 本期目标前言欣赏开始1. 角色移动和场景搭建2. 绑定枪械2.1 首先将各种枪械的素材添加给人物作为子物体2.2 给枪械也分别添加两个子物体用作标记枪口和弹仓位置 3. 枪械动画4. 切换枪械5. 发射功能5.1 手枪(1) 枪械随着鼠标旋转(2) 射击时间间隔(3) 创建好子弹、弹壳和…

xilinx zc706 10/100/100M以太网完整性测试说明

一&#xff1a;概述 最近接触FPGA比较多&#xff0c;本次是一款zc706芯片的FPGA&#xff0c;开发版是长这样的&#xff0c;基本上开发也是安装开发版的模块组合进行开发。 开发版上以太网芯片使用的是Marvell 881116R。 本次只是验证下控制以太网进行模式测试的说明&#xf…

子集 (力扣)数学推理 JAVA

给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[1,2],[3],[…

Windows10上Docker和Kubernetes的安装

官网&#xff1a;https://www.docker.com/products/docker-desktop/ 历史版本&#xff1a;https://download.docker.com/linux/static/stable/ 1、去Docker官网下载Docker Desktop&#xff0c;并一键安装 2、安装k8s所需的镜像 下载k8s-for-docker-desktop包 git clone http…

WAIC2023记录

汤晓鸥 学生与工作&#xff1a; 微软布局大模型方向

Vue3+Vite 项目配置 vue-router,并完成路由模块化

前言 我的技术栈&#xff1a;Vue3 Vite TypeScirpt我的包管理工具&#xff1a;pnpm&#xff08;v8.6.6&#xff09;我的 node.js 版本&#xff1a;v16.14.0 一、安装vue-router pnpm install vue-router二、创建页面 在 /src/views 文件夹下创建 home、login、test文件夹…