elasticSearch学习入门-DSL查询

elasticSearch学习入门-DSL查询本篇博文主要介绍了 es 的核心功能搜索 DSL 查询语句 主要是以各种丰富的查询语句来讲解 比如 match 条件查询 term level 范围查询 bool 布尔查询 以及过滤查询 主要目的是让读者熟悉 DSL 相关语法建议读者收藏便于在以后使用过程中查阅

1. 概念

​ 在es中搜索是非常重要的核心功能(说白了使用es存储数据主要目的就是为了更好更快更准确的搜索)而Elasticsearch提供了一种json风格的查询语言,称为Query DSL(Query domain-specific language)。查询语言功能很全面能结果我们生产中绝大部分的查询需求。下面跟随笔者一起来学习一下DSL查询的功能。

GET请求: http://ip:port/{ 
   index_name}/{ 
   type}/_search GET: http://xxx.xx.x.xxx:9200/singers/singer/_search 

DSL搜索 请求url是如上固定的,我们只需要修改json类型的查询条件

2. 数据准备

//1. 设置相关映射关系 { 
    "properties": { 
    "name": { 
    //字符串 "type": "text", "index": "true", "analyzer": "ik_max_word", //为name添加 keyword字段用于term精确查找 "fields": { 
    "keyword": { 
    "ignore_above": 256, "type": "keyword" } } }, "desc": { 
    //日期类型 "type": "text", "index": "true", //分词器  "analyzer": "ik_max_word", //为desc添加 keyword字段用于term精确查找 "fields": { 
    "keyword": { 
    "ignore_above": 256, "type": "keyword" } } } } } //2. 填充数据 不会bulk批量插入 见谅 POST http://xxx.xx.x.xx:9200/singers/singer/ { 
    "id": 42, "name": "音阙诗听", "signer_id": , "images": "http://y.gtimg.cn/music/photo_new/T001R150x150M000002vALgR3hRRlv.webp", "height": 1.64, "bitthday": "1994-10-21", "status": true, "desc": "音阙诗听音乐社,成立于2016年11月1日,由殇小瑾与李俊羽发起组织,聚集了全国各地一群对传统与流行音乐有相同和理念的朋友。成员在曲,词,演奏,演唱,后期制作,MV制作,美工,宣传等方面各展其长" } 

3. match条件查询

3.1 查询全部

//查询全部 { 
    "query": { 
    "match_all": { 
   } } } 

3.2 match查询

match 查询可操作文本、数值和日期类型的数据,

{ 
    "query": { 
    "match": { 
    "desc": "Eason Chan 香港" } }, //用来设置设置返回的数据字段 "_source":[ "id", "name", "desc" ] //从当前index开始获取 "from": 3, //每页获取数量 "size": 5 } 

主要是针对查询的”desc”字段的值中的搜索词进行分词(依据standard分词器 分成 ‘Eason‘,’Chan,’香‘,’港‘) 每个词组搜索命中最终将所有命中数据汇总到一起返回。

在这里插入图片描述

由 match 构建的 boolean 查询语句默认是逻辑或(or),当然,我们可以通过 operator 参数来改变这个默认行为。

minimum_should_match:最低匹配度 如果operator 为or的情况下 用于控制分词条件在倒排索引中最少的数量。

_source :用来定制化设置返回的展示字段
在这里插入图片描述

{ 
    "query": { 
    "match" : { 
    "desc" : { 
    "query" : "Eason Chan 香港", "operator" : "and" } } } } { 
    "query": { 
    "match" : { 
    "desc" : { 
    "query" : "Eason Chan 香港 歌手", "minimum_should_match" : 6 } } } } 

这样再次支持只查询出来 一条“陈奕迅”

3.3 match_phrase 查询

match_phrase有点类似match 但是却比match更加严格,是一种短语匹配 主要用于文本、数值和日期类型的数据查询。

短语之前有严格的距离限制 默认为紧邻距离为0 如果不符合则匹配不上(标签符号除外)。

{ 
    "query": { 
    "match_phrase": { 
    "desc":{ 
    //符合‘歌’和‘制’两者之间的距离为3的记录才会被查询出来  "query":"歌 制", //不写slop 默认为1 "slop":"3" } } } } 

3.4 match_phrase_prefix查询

与match_phrase查询类似,但是会对最后一个Token在倒排序索引列表中进行通配符搜索。Token的模糊匹配数控制:max_expansions 默认值为50

{ 
    "query": { 
    "match_phrase_prefix": { 
    "desc":{ 
    "query":"演员" "max_expansions": 1 } } } } 

3.5 mutil_match查询

mutil_match 用于多字段匹配查询

{ 
    "query" : { 
    "multi_match": { 
    "query": "周传雄", "fields": ["name", "desc"] } } } 

4、term-level 查询

我们知道,全文查询在执行查询之前,会先对提供的查询文本进行分析。

然而,Term-level 查询是直接查询倒排索引中的确切的值。

Term-level 查询通常用于结构化的数据,如数值、日期、枚举值或关键字,而不是文本分词查找类似于Mysql的范围查找

4.1 term查询

{ 
    "query": { 
    "term" : { 
    "name" : "周传雄" } } } 

该查询会将name中的“周传雄” 作为一个完整的词组(不分词)进行查询。

注意:此处name字段使用了ik中文分词器,所以中文分词器会对name进行分词如果直接对name进行查询有可能在分词器的作用下查找不到。 但是此处映射创建的时候为其创建了一个keyword字段(type也是keyword)所以查询的时候可以使用name.keyword这样就可以查询到了

{ 
    "query": { 
    "term" : { 
    "name.keyword" : "汪苏泷"} } } 

4.2 terms查询

{ 
    "query": { 
    "terms" : { 
    "name" :["汪苏泷", "周传雄"] } } } { 
    "query": { 
    "terms" : { 
    "name.keyword" :["汪苏泷", "周传雄"] } } } 

与term类似 只是查询字段支持数组类型类似于mysql 的in条件

4.3 range查询

range查询找出落在指定区间内的数字或者时间

{ 
    "query": { 
    "range" : { 
    "height" :{ 
    "gte" : 1.50, "lte" : 1.60, "boost" : 2.0 } } } } 

我们可以通过指定一个boost值来控制每个查询子句的相对权重,该值默认为1。一个大于1的boost会增加该查询子句的相对权重。一个高的boost值会产生一个高的_score。

4.4 exists查询

exists 返回字段值不为 null 的记录。

{ 
    "query": { 
    "exists" : { 
    "field" : "name" } } } 

4.5 prefix

返回字段的 term 以确切的前缀(前缀不会被分析)开头的记录。

{ 
    "query": { 
    "prefix" : { 
    "name" : "周" } } } 

4.6 wildcard 查询

wildcard 指的是通配符查询。

支持的通配符主要有:

  • * 匹配 0 个或多个任意字符
  • ? 匹配 1 个任意字符
{ 
    "query": { 
    "wildcard" : { 
    "name.keyword" : "陈??" } } } 

4.7 regexp查询

正则匹配查询

{ 
    "query": { 
    "regexp" : { 
    "name" : "jo.*" } } } 

4.8 fuzzy查询

fuzzy在es中可以理解为模糊查询,搜索本身很多时候是不精确的,很多时候我们需要在用户的查询词中有部分错误的情况下也能返回正确的结果

{ 
    "query": { 
    "fuzzy" : { 
    "name.keyword" : { 
    "value":"周杰雄", "fuzziness":2, "prefix_length":0, "max_expansions":100 } } } } 
  • fuzziness :本次查询允许的最大编辑距离,默认不开启模糊查询,相当于fuzziness=0。编辑距离是对两个字符串差异长度的量化,及一个字符至少需要处理多少次才能变成另一个字符,比如lucene和lucece只差了一个字符他们的编辑距离是1
  • prefix_length : 控制两个字符串匹配的最小相同的前缀大小,也即是前n个字符不允许编辑,必须与查询词相同,默认是0,prefix_length作用在分词后的词组级 比如prefix_length =2 则“周杰雄”前两个字需要完全匹配

    4.9 type查询

    type 查询指的是根据文档的 type 来查询。

    这里的 type 就是文档的类别(逻辑分组),类似于 MySQL 的数据表。

    查询type名为singer (singer表)的所有数据。

    { 
          "query": { 
          "type" : { 
          "value" : "singer" } } } 

    4.10 ids查询

    ids 查询指的是根据文档的 _id 集合来查询。

    { 
          "query": { 
          "ids" : { 
          "values" : ["J03cQn4BYNmJPaeL-JQr"] } } } 

    5 bool布尔查询

    Bool查询现在包括四种子句,must,filter,should,must_not

    1. must子句: 返回的文档必须满足must子句的条件,并且参与计算分值
    2. filter子句: 返回的文档必须满足filter子句的条件,不参与计算分值
    3. should子句: 返回的文档可能满足should子句的条件。有一个或者多个should子句,那么只要满足一个就可以返回。minimum_should_match参数定义了至少满足几个子句。
    4. must_no子句: 返回的文档必须不满足must_not定义的条件。
    { 
          "query": { 
          "bool": { 
          "must": [{ 
          "match": { 
          "name": "周传雄" } }], "must_not": [{ 
          "match": { 
          "name": "陈奕迅" } }], "should": [{ 
          "range": { 
          "height": { 
          "gte": "1.60", "lte": "1.80" } } }] } } } 

    6 过滤

    上述的3,4小节主要对es的查询语句进行了,下面我们来学习如何使es的DSL的过滤。

    • 查询语句:获取文档与查询语句的匹配程度,它会判断文档是否匹配并计算相关性评分(_score)的值
    • 过滤语句:获取文档是否匹配,而不会在意匹配程度(相关性评分)

    6.1 filter过滤

    #查询height大于1.80的记录(过滤) { 
          "query" : { 
          "constant_score": { 
          "filter": { 
          "range": { 
          "height": { 
          "gte": 1.80 } } } } } } #使用布尔查询添加过滤 { 
          "query": { 
          "bool": { 
          "filter": { 
          "multi_match": { 
          "query": "周传雄", "fields": ["name", "desc"] } } } } } 

    当我们不关心检索词频率TF(Term Frequency)对搜索结果排序的影响时,可以使用constant_score将查询语句query或者过滤语句filter包装起来

    6.1 post_filter过滤

    ​ 相对于上述在查询阶段进行过滤不同,该后置过滤器是对查询后的结果在进行过滤返回结果

    //查询符合desc字段 并过滤出来height 大于等于1.60的记录 { 
          "query": { 
          "match": { 
          "desc": "Eason Chan 香港" } }, "post_filter":{ 
          "range":{ 
          "height":{ 
          "gte":1.60 } } } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199121.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午1:48
下一篇 2026年3月26日 下午1:49


相关推荐

  • SpringBoot框架总结

    SpringBoot框架总结SpringBoot框架总结一、SpringBoot框架的概念1、传统框架的弊端例如传统的SSM框架整合了MyBatis、Spring、SpringMVC框架,但其需要繁琐且重复的配置使程序员很是痛苦2、SpringBoot框架SpringBoot框架在传统框架的基础上对其进一步封装,只需要一些简单的配置,省去了传统框架繁琐的配置,解放了程序员,使程序员只需要关注业务而无需将经历花费在框架的配置上,大幅提高了编程的效率二、SpringBoot框架的创建1、idea创建SpringBoot工程

    2022年8月21日
    26
  • UAT 环境_系统uac

    UAT 环境_系统uacUserAcceptEnvironment用户仿真测试环境转载于:https://www.cnblogs.com/qinqiu/p/5981222.html

    2022年9月30日
    4
  • vue子组件向父组件传值的三种方式_vue子组件修改父组件值

    vue子组件向父组件传值的三种方式_vue子组件修改父组件值如需了解老子怎么控制儿子的,传送门:子组件child.vue<template><div><button@click=”$emit(’emit’,’方式1:传参给父组件第1个参数’,’方式1:传参给父组件第2个参数’,’…’)”>方式1:通过emit传参给父组件(推荐此方式)</button><button@click=”emit(‘方式2:传参给父组件第1个参数’,’方式2…

    2022年10月2日
    6
  • 微信朋友圈自动点赞

    微信朋友圈自动点赞我一直都不太喜欢给别人点赞,某一年(貌似是17年)微信出了一次朋友圈年报,那一整年我就点出去了几个赞,要知道当时我微信好友应该有300+。我觉得这是我不喜欢参与社交活动在网络世界的一种体现吧。不给被人点赞也没啥坏处,但你不评不赞,难免会让你和好友之间有些疏远,给别人点赞吧我又嫌麻烦,于是一直想着做个自动点赞的东西,今天基本实现了,虽然诸多不完整和诸多限制,但还是决定分享出来,主要是我觉得还挺好玩的…

    2022年6月11日
    41
  • DHCP详解

    DHCP详解DHCP DNS 和 HTTP 是 3 种常见的高层协议 一 动态主机配置协议 DHCP1 DHCP 简介 DHCP DynamicHostC 动态主机配置协议 是一个应用层协议 当我们将客户主机 ip 地址设置为动态获取方式时 DHCP 服务器就会根据 DHCP 协议给客户端分配 IP 使得客户机能够利用这个 IP 上网 DHCP 的前身是 BOOTP

    2026年3月18日
    1
  • Arduino 串行通信之串口通信 UART 原理及释义

    Arduino 串行通信之串口通信 UART 原理及释义对于 Arduino 来说 甚至是对于电子学领域来说 信号分为数字信号和模拟信号 这两种信号又分为输入和输出两种情况 所以我的理解是电子学就是一门研究这四种情况相互关系的学科 模拟信号是一种连续变化的物理量 能帮助我们更好地理解周围环境的信息 任何的信息都可以用模拟信号来准确表达 但其缺点是易受噪声的影响 信号被多次复制 或进行长距离传输之后 会发生衰减 相比而言数字信号受噪声的影响小 易于传

    2026年3月18日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号