ElasticSearch8.X查询DSL语法案例进阶实战

什么是Query DSL

  • Query DSL主要由两部分组成:查询和过滤。
    • 查询部分:用于指定搜索条件和匹配规则。例如,可以使用match查询进行全文检索,term查询进行精确匹配,range查询进行范围匹配等。
    • 过滤部分:用于对查询结果进行进一步的筛选和过滤。与查询查询不同,过滤查询不会影响得分计算,只是对结果进行简单的筛选操作。

查询子句

  • term查询:匹配一个精确值,如一个单词或一个数字
{ "term": { "name":"lifly" } }
  • match查询:匹配一个查询字符串中的一个或多个单词
{ "match": { "content": "hello world" } }
  • range查询:匹配一个数值范围
    • 用于根据范围条件进行查询,例如指定价格在一定区间内的商品

    • 范围符号

      • gte:大于等于

      • gt:大于

      • lte:小于等于

      • lt:小于

{ "range": { "age": { "gte": 20, "lte": 30 } } }
  • 分页查询:指定要跳过的文档数量(from)和需要返回的文档数量(size)
{
  "size::10,
  "from":0,
  "query":{
    "match_all":{}
  }
}
  • 分页结果排序:sort字段进行排序,desc,asc
{
  "sort":{
    "value":"desc,asc"
  }
}
  • bool查询:使用布尔逻辑(与、或、非)进行复杂的查询操作

    • "must"关键字用于指定必须匹配的条件,即所有条件都必须满足

    • "must_not"关键字指定必须不匹配的条件,即所有条件都不能满足

    • "should"关键字指定可选的匹配条件,即至少满足一个条件

{  
  "bool": {  
    "must": [  { "match": { "title": "Elasticsearch" } }],  
    "must_not": [{ "match": { "tag": "old" } }  ],
    "should":[{"match":{"tag":"new"}}]
  }  
}

查询子句实战

创建索引


PUT /mall-shop_dsl
{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "title": {
        "type": "keyword"
      },
      "summary": {
        "type": "text"
      },
      "price": {
        "type": "float"
      }
    }
  }
}

插入数据

PUT /mall-shop_dsl/_bulk
{ "index": { "_index": "mall-shop_dsl" } }
{ "id": "1", "title": "Spring Boot","summary":"this is a summary Spring Boot video", "price": 9.99 }
{ "index": { "_index": "mall-shop_dsl" } }
{ "id": "2", "title": "java","summary":"this is a summary java video", "price": 19.99 }
{ "index": { "_index": "mall-shop_dsl" } }
{ "id": "3", "title": "Spring Cloud","summary":"this is a summary Spring Cloud video", "price": 29.99 }
{ "index": { "_index": "mall-shop_dsl" } }
{ "id": "4", "title": "Spring_Boot", "summary":"this is a summary Spring_Boot video","price": 59.99 }
{ "index": { "_index": "mall-shop_dsl" } }
{ "id": "5", "title": "SpringBoot","summary":"this is a summary SpringBoot video", "price": 0.99 }

查询dsl编写

精准查询 term 用于精确匹配一个指定字段的关键词,不进行分词处理
GET /mall-shop_dsl/_search
{
  "query":{
    "term":{
      "title":"Spring Boot"
    }
  }
}

在这里插入图片描述

match查询 用于执行全文搜索,它会将搜索查询与指定字段中的文本进行匹配
GET /mall-shop_dsl/_search
{
  "query":{
    "match": {
      "title": "SpringBoot"
    }
  }
}

在这里插入图片描述

match all查询,查询当前索引下所有数据
GET /mall-shop_dsl/_search
{
  "query":{
    "match_all": {}
  }
}

在这里插入图片描述

有条件查询,match对查询内容进行分词,然后进行查询,多个词条之间是or的关系
GET /mall-shop_dsl/_search
{
  "query":{
    "match": {
      "summary": "spring"
    }
  }
}

在这里插入图片描述

查询多个条件
GET /mall-shop_dsl/_search
{
  "query": {
    "match": {
      "summary": "spring cloud"
    }
  }
}

在这里插入图片描述

查询返回指定资源,source用于返回对应的字段
GET /mall-shop_dsl/_search
{
  "_source": ["title","price"], 
  "query": {
    "term": {
      "title": {
        "value": "java"
      }
    }
  }
}

在这里插入图片描述

range查询,查询价格大于1元小于20的数据
GET /mall-shop_dsl/_search
{
  "query":{
    "range":{
      "price":{
        "gt":1,
        "lt":20
      }
    }
  }
}

在这里插入图片描述

分页查询,查询从0开始的每页2个文档数量的数据

GET /mall-shop_dsl/_search
{
  "size": 2,
  "from": 3,
  "query": {
    "match_all": {}
  }
}

在这里插入图片描述

bool查询,查询价格大于20,且title为java的数据
GET /mall-shop_dsl/_search
{
  "query":{
    "bool": {
      "must": [
        {
          "match": {
          "summary": "Cloud"
          }
        },
        {
          "range": {
            "price": {
              "gt": 20
            }
          }
        }
      ]
    }
  }
}

在这里插入图片描述

Query DSL查询过滤Filter多案例实战

filter查询

  • 对查询结果进行筛选和过滤,返回符合条件的文档。
  • filter查询对结果进行缓存,提高性能查询,用于数字,日期日期,布尔逻辑,存在性检查等操作。
  • term过滤:与term查询类似,但不会影响得分计算
  • range()过滤:与range查询类似,但也不会影响得分计算
  • exists过滤:匹配存在指定字段的文档
  • missing过滤:匹配不存在指定字段的文档
  • 语法格式:
{
  "query": {
    "bool": {
      "filter": {
        // 过滤条件
      }
    }
  }
}

案例一:使用term过滤器查询title为java的数据


GET /mall-shop_dsl/_search
{
  "query": {
    "bool": {
      "filter": [
        {"term": {
          "title": "java"
        }}
      ]
    }
  }
}

在这里插入图片描述

使用range过滤器查询价格price在10-30之间的数据


GET /mall-shop_dsl/_search
{
  "query": {
    "bool": {
      "filter": [
        {"range": {
          "price": {
            "gte": 10,
            "lte": 30
          }
        }}
      ]
    }
  }
}

在这里插入图片描述

match高级用法之多字段匹配和短语搜索实战

  • match高级用法之多字段匹配

    • 多字段搜索匹配

      • 业务查询,需要在多个字段上进行文本搜索,用multi_match

      • 在match的基础上支持多个字段进行文本匹配查询。

      • 语法格式


GET /index/_search
{
  "query": {
    "multi_match": {
      "query": "要搜索的文本",
      "fields": ["字段1", "字段2", ...]
    }
  }
}# query:需要匹配的查询文本。
# fields:一个包含需要进行匹配的字段列表的数组。
- 短语搜索匹配
	- elasticsearch提供的一种高级匹配查询类型,用于执行精确的短语搜索。
	- 相对于match查询,match_phrase会在匹配时考虑单词的顺序和位置
	- 语法格式
GET /index/_search
{
  "query": {
    "match_phrase": {
      "field_name": {
        "query": "要搜索的短语"
      }
    }
  }
}# field_name:要进行匹配的字段名。
# query:要搜索的短语。
  • 创建索引
PUT /product
{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
      "product_name": {
        "type": "text"
      },
      "description": {
        "type": "text"
      },
      "category": {
        "type": "keyword"
      }
    }
  }
}

插入数据


POST /product/_bulk
{ "index": { "_index": "product", "_id": "1" } }
{ "product_name": "iPhone 12", "description": "The latest iPhone model from Apple", "category": "electronics" }
{ "index": { "_index": "product", "_id": "2" } }
{ "product_name": "Samsung Galaxy S21", "description": "High-performance Android smartphone", "category": "electronics" }
{ "index": { "_index": "product", "_id": "3" } }
{ "product_name": "MacBook Pro", "description": "Powerful laptop for professionals", "category": "electronics" }
{ "index": { "_index": "product", "_id": "4" } }
{ "product_name": "Harry Potter and the Philosopher's Stone", "description": "Fantasy novel by J.K. Rowling", "category": "books" }
{ "index": { "_index": "product", "_id": "5" } }
{ "product_name": "The Great Gatsby", "description": "Classic novel by F. Scott Fitzgerald", "category": "books" }
  • 在product_name和description字段上执行了一个multi_match,将查询文本设置为"iphone",对这两个字段进行搜索,并返回匹配到的文档,这个是or的关系,会有最佳匹配。
GET /product/_search
{
  "query": {
    "multi_match": {
      "query": "iphone",
      "fields": ["product_name","description"]
    }
  }
}

在这里插入图片描述

使用match_phrase查询在description字段上执行了一个短语搜索将要搜索的短语设置为 “classic novel”。使用match_phrase查询,Elasticsearch将会返回包含 “classic novel” 短语的文档

GET /product/_search
{
  "query": {
    "match_phrase": {
      "description": "classic novel"
    }
  }
}

在这里插入图片描述

日常单词拼写错误-fuzzy模糊查询案例实战

介绍

  • fuzzy查询是Elasticsearch中提供的一种模糊匹配查询类型,用在搜索时容忍一些拼写错误或近似匹配

  • 使用fuzzy查询,可以根据指定的编辑距离(即词之间不同字符的数量)来模糊匹配查询词

  • fuzzy模糊查询是拼写错误的简单解决方案,但具有很高的 CPU 开销和非常低的精准度

  • 参数介绍

    • filed_name:要进行模糊匹配的字段名。

    • value:要搜索的词

    • fuzziness:参数指定了模糊度

      • 0,1,2

        • 指定数字,表示最大编辑距离,较低的数字表示更严格的匹配,较高的数字表示更松散的匹配。

        • fuzziness的值,表示针对某个单词而言,而不是总的错误的数值。

      • auto:elasticsearch根据词的长度自动选择模糊度

        • 如果字符串的长度大于5,那fuzziness的值自动设置为2

        • 如果字符串的长度小于2,那fuzziness的值自动设置为0

松散匹配


GET /product/_search
{
  "query": {
    "fuzzy": {
      "description": {
        "value": "nov",
        "fuzziness": "2"
      }
    }
  }
}

在这里插入图片描述

严格匹配

GET /product/_search
{
  "query": {
    "fuzzy": {
      "description": {
        "value": "nov",
        "fuzziness": "1"
      }
    }
  }
}

在这里插入图片描述

自动检查

GET /product/_search
{
  "query": {
    "fuzzy": {
      "description": {
        "value": "novek",
        "fuzziness": "auto"
      }
    }
  }
}

在这里插入图片描述

DSL搜索高亮显示案例实战

  • 在 ES 中,高亮语法用于在搜索结果中突出显示与查询匹配的关键词

  • 高亮显示是通过标签包裹匹配的文本来实现的,通常是 或其他 HTML 标签

  • 基本用法:在 highlight 里面填写要高亮显示的字段,可以填写多个

  • 在DSL查询语句中添加highlight字段,指定要高亮的字段以及高亮显示的前置和后置标签。

  • 高亮显示通常只适用于全文检索查询(如match、multi_match等),因为这类查询会对文本进行分词处理,从而能够识别出与查询关键词匹配的文本片段。

单条件查询高亮显示(商品名称为iphone)

GET /product/_search
{
  "query": {
    "match": {
      "product_name": "iPhone"
    }
  },
  "highlight": {
    "fields": {
      "product_name": {}
    }
  }
}

在这里插入图片描述

多条件查询(title为iPhone,description中包含iphone的高亮显示)

GET /product/_search
{
  "query": {
    "bool": {
      "should": [
        {"match": {
          "product_name": "iphone"
        }},
        {
          "match": {
            "description": "iphone"
          }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "product_name": {},
      "description": {}
    }
  }
}

在这里插入图片描述

多条件查询(title为iPhone,description中包含iphone的高亮显示)修改样式

  • pre_tags:前置标签

  • post_tags:后置标签

  • fields:需要高亮的字段


GET /product/_search
{
  "query": {
    "bool": {
      "should": [
        {"match": {
          "product_name": "iphone"
        }},
        {
          "match": {
            "description": "iphone"
          }
        }
      ]
    }
  },
  "highlight": {
    "pre_tags": "<font color='yellow'>",
    "post_tags": "</font>",
    "fields": {
      "product_name": {},
      "description": {}
    }
  }
}

在这里插入图片描述

通过本实战指南,您已掌握了Elasticsearch Query DSL的核心技能,从基础查询到高级搜索技巧,再到性能优化策略。实践是检验真理的唯一标准,鼓励您动手尝试这些示例,在真实项目中灵活运用这些知识,构建高性能、高灵活性的搜索解决方案。无论是处理海量数据的快速检索,还是构建精准的全文搜索体验,Query DSL都是您不可或缺的工具箱。继续探索Elasticsearch的广阔世界,让数据为您所用,解锁更多业务洞察与价值。

更多精彩内容请关注以下公众号

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么使用python进行整除取余求幂

怎么使用python进行整除取余求幂&#xff1f; 整除法是//&#xff0c;称为地板除&#xff0c;两个整数的除法仍然是整数。 10//33 3 求模运算是%&#xff0c;相当于mod&#xff0c;也就是计算除法的余数。 5%2 1 求幂运算使用两个连续的*&#xff0c;幂运算符比取反的优先级高…

一码多址与同义词解决方案

随着地址库中的数据不断的丰富&#xff0c;地址库中一码多址和同义词的数据也会越来越多&#xff0c;一码多址和同义词在统一地址管理平台中的概念并不相同。 一码多址指的是多个地址编码相同&#xff0c;例如通过民政地址找到编码&#xff0c;再通过编码找到房产地址描述。 本…

meizu M10 魅蓝 10 mblu10 root 解锁 安装LSPosed框架 紫光展锐改串 AT命令 一键新机 改机软件 硬改 改参数

meizu M10 魅蓝 10 mblu10 root 解锁 安装LSPosed框架 紫光展锐改串 AT命令 一键新机 改机软件 硬改 改参数 ro.system.build.version.release11 ro.system.build.version.release_or_codename11 ro.system.build.version.sdk30 ro.system.custom.versionAndroid_M01 ro.prod…

苹果Mac安装adobe软件报错“installer file may be damaged”解决方案

最近Mac电脑系统的有小伙伴在安装PS、AI、AE、PR等软件&#xff0c;出现了一个错误&#xff0c;让人头疼不已&#xff0c;苦苦找寻&#xff0c;也找不到完美的解决方法。让我们来一起看看吧&#xff01; 很多小伙伴都喜欢苹果电脑&#xff0c;但是在安装外来软件时&#xff0c;…

AI Agent实战:智能检索在Kingbase数据库管理中的优势应用

前言 在信息技术飞速发展的今天&#xff0c;数据库管理已成为IT专业人员日常工作中不可或缺的一部分。然而&#xff0c;面对复杂的SQL问题&#xff0c;传统的web搜索往往难以提供精准的答案&#xff0c;尤其是在针对特定数据库系统&#xff0c;如金仓数据库时&#xff0c;这种…

eventbus和vuex

EventBus和Vuex EventBus 工作原理 创建一个vue实例&#xff0c;然后通过空的vue实例作为组件之间的桥梁&#xff0c;进行通信&#xff0c;利用到的设计模式有发布订阅模式 Vuex 工作原理 维护了一个state树&#xff0c;是独立的状态树&#xff0c;有明显的层级关系。不论…

数据资产与云计算深度融合:借助云计算技术,优化数据存储、高效处理并创新应用,驱动企业数字化转型

目录 一、引言 二、数据资产与云计算深度融合的必要性 1、数据资产的重要性 2、云计算技术的优势 三、云计算技术在数据资产管理中的应用 1、数据存储的优化 2、数据处理的高效性 3、数据应用的创新 四、云计算驱动企业数字化转型的实践案例 案例一&#xff1a;金融行…

YCSB基准测试

1、Redis: 下载成功后&#xff0c;加载数据&#xff0c;运行 启动redis: /usr/local/redis/bin/redis-server ./bin/ycsb load redis -P workloads/workloade -p redis.hostlocalhost -p redis.port6379 -p recordcount10000 -p operationcount10000 -threads 32 ./bin/y…

【数据库】Oracle安装报错(口令设置问题)

目录 一、问题场景&#xff1a; 二、问题描述 三、原因分析&#xff1a; 四、解决方案&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 一、问题场景&#xff1a; Oracle安装 二、问题描述 Oracle安装意外中断导致【口令管理】用户没有取消勾选/修改密码 三、原因…

【React】ref

概述 使用 ref 引用值 – React 中文文档 希望组件“记住”某些信息&#xff0c;但又不想让这些信息更新时 触发新的渲染 时&#xff0c;可以使用 ref 。 也就是说 ref 对象 包裹的值 React 追踪不到的&#xff0c;他像是用来存储组件信息的秘密“口袋”。 与 state 相同的是…

web前端——javaScript

目录 一、javaScript概述 1.javaScript历史 2.JavaScript与html,css关系 二、基本语法 ①放在head中 ②放在 body中 ③写在外部的.js文件中 1.变量 2.数据类型 3.算术运算符 4.逻辑运算符 5.赋值运算 6.逻辑运算符 7.条件运算符 8.控制语句 三、函数 1…

《数字图像处理》实验报告六

一、实验任务与要求 比较采用不同的色彩空间对彩色图像处理的效果&#xff0c;处理包括&#xff1a; a&#xff09;直方图均衡化 b&#xff09;图像增强 二、实验报告 &#xff08;一&#xff09;RGB色彩空间的直方图均衡化 / 锐化处理 1、matlab 实现代码&#xff1a; %…

Vue中数组的【响应式】操作

在 Vue.js 中&#xff0c;当你修改数组时&#xff0c;Vue 不能检测到以下变动的数组&#xff1a; 当你利用索引直接设置一个项时&#xff0c;例如&#xff1a;vm.items[indexOfItem] newValue当你修改数组的长度时&#xff0c;例如&#xff1a;vm.items.length newLength 为…

谷歌上搞下来的,无需付费,可以收藏!

在数字化时代&#xff0c;我们越来越依赖于智能设备来获取信息和知识。中国智谋App正是这样一款应用&#xff0c;它将中国古代的智慧与谋略书籍带入了我们的移动设备&#xff0c;让我们能够随时随地学习和领悟。而且提供文言文的原文和译文。 软件下载方式&#xff1a;谷歌上搞…

39.右键弹出菜单管理游戏列表

上一个内容&#xff1a;38.控制功能实现 以 ​​​​​​​ 38.控制功能实现 它的代码为基础进行修改 效果图&#xff1a; 点击设置之后的样子 点击删除 点击删除之后的样子 实现步骤&#xff1a; 首先添加一个菜单资源&#xff0c;右击项目资源选择下图红框 然后选择Menu 然…

Docker(九)-Docker运行redis6.0.8容器实例

1.宿主机新建目录存放redis.conf文件 目的&#xff1a;运行redis容器实例时使用自己的配置文件2.运行redis容器实例 docker run -d -p 6379:6379 --privilegedtrue -v 【宿主机配置文件目录】:/etc/redis/redis.conf -v 【宿主机数据目录】:/data --nameredis6.0.8 redis:6.0…

Keka for Mac:轻量级压缩解压神器

Keka for Mac是一款专为Mac用户打造的轻量级压缩解压软件&#xff0c;凭借其强大的功能和简洁易用的界面&#xff0c;赢得了众多用户的喜爱。无论是日常办公还是学习娱乐&#xff0c;Keka都能为您提供高效、安全的文件压缩和解压体验。 Keka for Mac v1.4.2中文版下载 产品特点…

记录一次CMS的代码审计

本次代码审计使用了白加黑的手法&#xff0c;用黑盒的视角测试功能点&#xff0c;用白盒的方式作为验证。 0x1 XSS guestbook处&#xff0c;可以看到有一个留言板 idea搜索guestbook。发现代码如下&#xff0c;其中的getModel是获取数据的方法。Guestbook.class就是具体要获取…

MySQL索引优化解决方案--索引介绍(1)

什么是索引 MySQL官方对于索引的定义&#xff1a;索引是帮助MySQL高效过去数据的数据结构。 MySQL在存储数据之外&#xff0c;数据库系统中还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种引用&#xff08;指向&#xff09;表中的数据&#xff0c;这样我们…

使用ChatGPT提升编程效率:程序员的最佳实践分享

在这个信息技术飞速发展的时代&#xff0c;编程已经成为了越来越多人的必备技能。无论你是初学者&#xff0c;还是经验丰富的开发者&#xff0c;都可能会遇到编程中的各种问题和挑战。幸运的是&#xff0c;AI 技术的进步让我们有了新的解决工具——ChatGPT。作为一名科技博客博…