【Elasticsearch入门到落地】13、DSL查询详解:分类、语法与实战场景

news2025/6/1 14:46:17

接上篇《12、索引库删除判断以及文档增删改查》
上一篇我们讲解了如何判断索引库是否存在并删除它,以及如何对索引库中的文档进行增删改查操作。本篇我们进入ElasticSearch的DSL语法的详解。

Elasticsearch(ES)作为强大的分布式搜索引擎,其核心功能之一是通过DSL(Domain Specific Language)实现灵活的数据查询。本文将深入解析ES DSL查询的三大核心分类:全文检索查询、精确查询和地理查询,结合实际场景和语法示例,帮助开发者快速掌握ES查询精髓。

一、DSL查询基础结构

ES查询的基本结构遵循JSON格式,主要包含以下两部分:

GET /indexName/_search
{
  "query": {
    // 查询条件定义
    "查询类型":{
      "查询条件":"条件值"
    }
  },
  "from": 0,      // 分页起始位置
  "size": 10,     // 每页返回数量
  "sort": [       // 排序规则
    {"price": "asc"}
  ]
}

二、全文检索查询

1. 使用场景

●博客文章内容搜索

●电商商品描述匹配

●日志分析中的文本挖掘
●任何需要基于文本相似度匹配的场景

2. 核心查询类型

(1)match查询(最常用)

GET /indexName/_search
{
  "query": {
    "match": {
      "title": {
        "query": "Elasticsearch教程",
        "operator": "and",  // 可选:and/or
        "minimum_should_match": "75%", // 最小匹配度
        "fuzziness": "AUTO"  // 模糊匹配
      }
    }
  }
}

关键参数:
●operator:控制多个查询词的逻辑关系(默认OR)
●minimum_should_match:设置最低匹配词比例
●fuzziness:允许的拼写错误容忍度(AUTO/0/1/2)

案例测试1:

# 模糊搜索
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "外滩如家"
    }
  }
}

案例结果1:

案例测试2:

# 模糊搜索
GET /hotel/_search
{
  "query": {
    "match": {
      "name": {
        "query": "7天酒店",
        "operator": "and", 
        "minimum_should_match": "75%",
        "fuzziness": "AUTO"
      }
    }
  }
}

案例结果2:

(2)multi_match查询(多字段匹配)

GET /indexName/_search
{
  "query": {
    "multi_match": {
      "query": "大数据分析",
      "fields": ["title^3", "content", "tags"], // ^3表示权重
      "type": "best_fields" // 匹配策略
    }
  }
}

匹配策略:
●best_fields:最佳字段匹配(默认)
●most_fields:多数字段匹配
●cross_fields:跨字段匹配
●phrase:短语匹配
●phrase_prefix:短语前缀匹配

案例测试:

GET /hotel/_search
{
  "query": {
    "multi_match": {
      "query": "外滩如家",
      "fields": ["brand^3", "name", "business"], 
      "type": "best_fields" 
    }
  }
}

案例结果:

(3)match_phrase查询(短语匹配)

GET /indexName/_search
{
  "query": {
    "match_phrase": {
      "content": "快速排序算法",
      "slop": 1 // 允许词间最大距离
    }
  }
}

match_phrase查询用于精确匹配短语,同时允许指定词间最大距离(通过 slop 参数)
slop表示允许的词序调整次数(例如将"上海 浦东 东站"调整为"上海浦东 东站"需要1次调整)

案例测试:

GET /hotel/_search
{
  "query": {
    "match_phrase": {
      "name": "上海浦东东站"
    }
  }
}

案例结果:

(4)query_string查询(复杂查询)

GET /indexName/_search
{
  "query": {
    "query_string": {
      "query": "(Java OR Python) AND 开发",
      "default_field": "content",
      "fields": ["title^2", "content"]
    }
  }
}

特点:
支持Lucene查询语法
可指定多个字段及权重
适合复杂查询需求

案例测试1:

GET /hotel/_search
{
  "query": {
    "query_string": {
      "query": "西藏 AND 万怡",
      "default_field": "name"
    }
  }
}

案例结果1:

案例测试2:

GET /hotel/_search
{
  "query": {
    "query_string": {
      "query": "(机场 OR 地铁) AND 如家",
      "fields": ["name", "business"]
    }
  }
}

案例结果2:

注意:query_string查询默认会对文本进行分词处理,如果name字段被映射为keyword类型而不是text类型,查询可能不会按预期工作。例如"商业区"可能被分词为"商"、"业"和"区"三个词,查询要求同时包含这三个词,但很多"商业区"酒店标识可能被分词为单个词,搜索时可以将"商业区"用引号括起来表示短语匹配:
"query": "(地铁 OR \"商业区\") AND 7天"

三、精确查询(Term-level Queries)

1. 使用场景

●用户ID精确查找
●订单状态筛选
●价格范围查询
●日期区间查询
●需要精确匹配而非文本分析的场景

2. 核心查询类型

(1)term查询(精确匹配)

GET /indexName/_search
{
  "query": {
    "term": {
      "status": "active" // 不进行分词,直接匹配
    }
  }
}

案例测试:

GET /hotel/_search
{
  "query": {
    "term": {
      "business": "宝安商业区" 
    }
  }
}

案例结果:

(2)terms查询(多值精确匹配)

GET /indexName/_search
{
  "query": {
    "terms": {
      "tags": ["java", "elasticsearch", "分布式"]
    }
  }
}

案例测试:

GET /hotel/_search
{
  "query": {
    "terms": {
      "name": ["如家酒店","机场"] 
    }
  }
}

案例结果:

(3)range查询(范围查询)

GET /indexName/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 100,
        "lte": 500,
        "boost": 2.0 // 权重
      }
    }
  }
}

案例测试:

GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 100,
        "lte": 140
      }
    }
  },
  "from": 0,      
  "size": 100,     
  "sort": [       
    {"price": "asc"}
  ]
}

注:这里加了分页和排序,按照价格从低到高

案例结果:

(4)exists查询(字段存在性检查)

GET /indexName/_search
{
  "query": {
    "exists": {
      "field": "description"
    }
  }
}

案例测试:

GET /hotel/_search
{
  "query": {
    "exists": {
      "field": "city"
    }
  },
  "from": 0,      
  "size": 100,     
  "sort": [       
    {"price": "asc"}
  ]
}

案例结果:

(5)bool组合查询(逻辑组合)

GET /indexName/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {"status": "active"}},
        {"range": {"price": {"gte": 100}}}
      ],
      "filter": [  // filter过滤,但不参与评分
        {"term": {"category": "electronics"}}
      ],
      "should": [  // 可选条件
        {"term": {"is_recommended": true}}
      ],
      "minimum_should_match": 1
    }
  }
}

注:minimum_should_match只影响bool查询中的should部分,minimum_should_match参数用于控制should子句中的匹配条件,它指定了在should子句中至少需要匹配多少个条件才能使整个bool查询匹配。

案例测试:
寻找在上海,打分超过40分以上,价格不超过200元,且是如家的酒店,可选条件是二钻:

{
  "query": {
    "bool": {
      "must": [
        {"term": {"city": "上海"}},
        {"range": {"price": {"lte": 200}}},
        {"range": {"score": {"gte": 40}}}
      ],
      "filter": [  
        {"term": {"brand": "如家"}}
      ],
      "should": [  
        {"term": {"starName": "二钻"}}
      ],
      "minimum_should_match": 1
    }
  }
}

案例结果:

四、地理查询(Geo Queries)

此场景不再举例子,大家按照需要查询关键坐标匹配即可。

1. 使用场景

●附近商家搜索
●物流配送范围查询
●基于地理位置的推荐系统
●轨迹分析

2. 核心查询类型

(1)geo_distance查询(距离查询)

GET /indexName/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_distance": {
          "distance": "10km",
          "location": {  // 中心点坐标
            "lat": 39.57,
            "lon": 106.55
          }
        }
      }
    }
  }
}

(2)geo_bounding_box查询(矩形区域查询)

GET /indexName/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_bounding_box": {
          "location": {
            "top_left": {
              "lat": 30.0,
              "lon": 106.0
            },
            "bottom_right": {
              "lat": 29.0,
              "lon": 107.0
            }
          }
        }
      }
    }
  }
}

(3)geo_polygon查询(多边形区域查询)

GET /indexName/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_polygon": {
          "location": {
            "points": [
              {"lat": 30.0, "lon": 106.0},
              {"lat": 30.0, "lon": 107.0},
              {"lat": 29.0, "lon": 107.0},
              {"lat": 29.0, "lon": 106.0}
            ]
          }
        }
      }
    }
  }
}

(4)geo_shape查询(复杂形状查询)

GET /indexName/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_shape": {
          "location": {
            "shape": {
              "type": "envelope",  // 矩形
              "coordinates": [[106.0, 30.0], [107.0, 29.0]]
            },
            "relation": "intersects" // 空间关系
          }
        }
      }
    }
  }
}

五、性能优化建议

1、全文检索优化:

●合理设置分词器
●使用minimum_should_match控制匹配精度
●避免在高频字段上使用match_all

2、精确查询优化:

●为常用精确查询字段设置keyword类型
●使用filter上下文提高缓存效率
●避免在bool查询中嵌套过多条件

3、地理查询优化:

●使用geo_point类型存储地理位置
●对地理查询使用filter上下文
●合理设置distance_type(arc/plane)

下一篇我们继续讲解DSL查询语法中“相关性算分”、“FunctionScoreQuery”和“BooleanQuery”的相关内容。

转载请注明出处:https://blog.csdn.net/acmman/article/details/148195366

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

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

相关文章

[欠拟合过拟合]机器学习-part10

7.欠拟合过拟合 7.1欠拟合 欠拟合是指模型在训练数据上表现不佳,同时在新的未见过的数据上也表现不佳。这通常发生在模型过于简单,或者是训练的次数不够,无法捕捉数据中的复杂模式时。欠拟合模型的表现特征如下: 训练误差较高。 …

【windwos】文本编辑器Notepad++ 替代品Notepad--

一、N和N--对比介绍 曾经备受推崇的「Notepad」曾是Windows上的经典代码编辑器。然而,作者的一些政治言论已经让它被广大中国用户抛弃。 一个名为「Notepad--」的新编辑器,也是开源免费,功能和实用性也在尽可能接近。与此同时,「N…

Linux基本指令篇 —— clear指令

clear 是 Linux 和 Unix 系统中用于清空终端屏幕的常用命令。它的作用是移除当前终端窗口中的所有可见内容,提供一个干净的界面,类似于“刷新”终端。以下是关于 clear 的详细解析: 目录 1. 基本用法 2. 实现原理 3. 常见场景 场景 1&…

阿里云DDoS防护:万一被“黑”了,如何更换IP地址?

阿里云DDoS防护:万一被“黑”了,如何更换IP地址“绝地反击”? 各位站长、运维老铁、业务负责人们,大家好!在如今这个网络世界,最让人提心吊胆的,莫过于遭遇**DDoS攻击(分布式拒绝服…

【小白量化智能体】应用2:编写通达信绘图指标及生成Python绘图程序

【小白量化智能体】应用2:编写通达信绘图指标及生成Python绘图程序 【小白量化智能体】是指能够自主或半自主地通过与环境的交互来实现目标或任务的计算实体。智能体技术是一个百科全书,又融合了人工智能、计算机科学、心理学和经济学等多个领域的知识&a…

C++23 std::start_lifetime_as:用于隐式生存期类型的显式生存期管理函数 (P2590R2)

文章目录 一、C23简介二、std::start_lifetime_as 基本概念函数原型模板参数参数返回值注意事项示例代码 三、std::start_lifetime_as 的作用1. 避免复杂的拷贝操作2. 保持对象表示不变3. 简化代码逻辑 四、std::start_lifetime_as 的使用场景1. 内存池管理2. 类型双关&#xf…

Innodb底层原理与Mysql日志机制深入刨析

MySQL的内部组件结构 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 Server层 主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实…

JMeter-SSE响应数据自动化

结构图 背景: 需要写一个JMeter脚本来进行自动化测试,主要是通过接口调用一些东西,同时要对响应的数据进行处理,包括不限于错误信息的输出。 1.SSE(摘录) SSE(Server-Sent Events)是一种基于HTTP协议、允许…

泛型(1)

1.泛型的理解和好处 使用传统方法的问题分析 (1)不能对加入到集合ArrayList中的数据类型进行约束 (2)遍历的时候,需要进行类型装换,如果集合中的数量较大,对效率有影响. 使用泛型的好处 (1)使用泛型添加 (检查元素的类型,提高了安全性.) (2)减少了类型转换的次数,提高效率…

esp8266 点灯科技远程控制继电器

手机端安装点灯科技app 打开 Arduino IDE 编辑&#xff1a; #define BLINKER_WIFI #include <Blinker.h> char auth[] "点灯科技 key"; char ssid[] "wifi ID"; char pswd[] "WiFi key"; // 新建组件对象 BlinkerButton Button1(&q…

MMA: Multi-Modal Adapter for Vision-Language Models论文解读

abstract 预训练视觉语言模型&#xff08;VLMs&#xff09;已成为各种下游任务中迁移学习的优秀基础模型。然而&#xff0c;针对少样本泛化任务对VLMs进行微调时&#xff0c;面临着“判别性—泛化性”困境&#xff0c;即需要保留通用知识&#xff0c;同时对任务特定知识进行微…

使用 Cannonballs 进行实用导体粗糙度建模

在 GB/s 制度下&#xff0c;导体损耗的精确建模是高速串行链路设计成功的前提。未能对粗糙度效果进行建模可能会毁了您的一天。例如&#xff0c;图 1 显示了与测量数据相比&#xff0c;无粗糙度的 40 英寸印刷电路板 &#xff08;PCB&#xff09; 走线的模拟总损耗。总损耗是电…

Spring Boot 注解 @ConditionalOnMissingBean是什么

一句话总结&#xff1a; ConditionalOnMissingBean 是 Spring Boot 提供的一个 条件注解&#xff08;Conditional Annotation&#xff09;&#xff0c;意思是&#xff1a; 只有当 Spring 容器中 不存在 某个 Bean 时&#xff0c;当前的 Bean 或配置才会被加载。 这是一种典型的…

(先发再改)测试流程标准文档

Revision Record 修订记录 序号 修改日期 修改章节 修改描述 拟制 审批 修订版本 1 20250520 初稿 v1.0 目录 1. 文档概述... 7 1.1 文档目的... 7 1.1.1 标准化质量保障流程... 7 1.1.2.…

亚马逊SP-API开发实战:商品数据获取与操作

一、API接入准备 开发者注册&#xff1a; 登录亚马逊开发者中心申请SP-API权限 完成MWS迁移&#xff08;如适用&#xff09; 认证配置&#xff1a; # OAuth2.0认证示例 import requests auth_url "https://api.amazon.com/auth/o2/token" params { "…

行为型:策略模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 5、优化技巧 1、核心思想 目的&#xff1a;将算法&#xff08;行为&#xff09;抽象出来作为一系列策略类&#xff0c;使他们可以相互替换&#xff0c;使系统拥有“可插拔”扩展的能…

知识宇宙-学习篇:开源项目 README 文档该如何写?

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、README 文档的重要性1. 项目的第一印象2. 搜索引擎优化的重要载体 二、现代 RE…

YOLOv12增加map75指标

YOLOv12源码&#xff1a;https://github.com/sunsmarterjie/yolov12 第一步&#xff1a;更改Val.py文件 地址&#xff1a;该文件在yolov12-main\ultralytics\models\yolo\detect下 首先定位到def get_desc(self):这个函数上 代码修正如下&#xff1a; def get_desc(self):&q…

Avalanche 六期 Workshop 精华合集|Grant 机会、技术深度、项目实战一文回顾!

作为当前区块链技术的前沿代表&#xff0c;Avalanche 以其独特的高吞吐、低延迟、多链架构&#xff0c;为开发者提供了一种颠覆性的 Layer 1 解决方案。不同于传统的 EVM 兼容链&#xff0c;Avalanche 支持开发者自定义执行环境&#xff0c;灵活选择最适合自身业务需求的虚拟机…

【MySQL】第九弹——索引(下)

文章目录 &#x1f30f;索引(上)回顾&#x1f30f;使用索引&#x1fa90;自动创建索引&#x1fa90;手动创建索引&#x1f680;主键索引&#x1f680;普通索引&#x1f680;唯一索引&#x1f680;复合索引 &#x1fa90;查看索引&#x1fa90;删除索引&#x1f680;删除主键索引…