Elasticsearch(ES)基础查询语法的使用

1. Match Query (全文检索查询)
  • 用于执行全文检索,适合搜索文本字段。

    {
    “query”: {
    “match”: {
    “field”: “value”
    }
    }
    }

  • match_phrase:精确匹配短语,适合用于短语搜索。

    {
    “query”: {
    “match_phrase”: {
    “field”: “text”
    }
    }
    }

2. Term Query (精确匹配查询)
  • 用于对某个字段的精确值进行查询,常用于不分词的字段(如ID、标签、关键词等)。

    {
    “query”: {
    “term”: {
    “field”: “value”
    }
    }
    }

3. Range Query (范围查询)
  • 用于查询数值、日期、时间等范围内的数据。

    {
    “query”: {
    “range”: {
    “field”: {
    “gte”: 10, // 大于等于
    “lte”: 100, // 小于等于
    “gt”: 10, // 大于
    “lt”: 100 // 小于
    }
    }
    }
    }

4. Bool Query (布尔查询)
  • 用于将多个查询组合在一起,可以使用 mustshouldmust_not 等操作符。

    {
    “query”: {
    “bool”: {
    “must”: [
    { “match”: { “field1”: “value1” } },
    { “match”: { “field2”: “value2” } }
    ],
    “filter”: [
    { “range”: { “price”: { “gte”: 50 } } }
    ],
    “should”: [
    { “match”: { “field3”: “value3” } }
    ],
    “must_not”: [
    { “term”: { “field4”: “value4” } }
    ]
    }
    }
    }

5. Prefix Query (前缀匹配查询)
  • 用于查询字段值的前缀匹配,常用于搜索补全或模糊搜索。

    {
    “query”: {
    “prefix”: {
    “field”: “prefix_value”
    }
    }
    }

6. Wildcard Query (通配符查询)
  • 支持*(匹配任意字符)和?(匹配单个字符)的通配符查询。

    {
    “query”: {
    “wildcard”: {
    “field”: “prefix*”
    }
    }
    }

7. Fuzzy Query (模糊查询)
  • 用于查询与某个值相似的字段,常用于容忍拼写错误的场景。

    {
    “query”: {
    “fuzzy”: {
    “field”: {
    “value”: “exampl”
    }
    }
    }
    }

8. Regexp Query (正则表达式查询)
  • 使用正则表达式进行查询。

    {
    “query”: {
    “regexp”: {
    “field”: “pattern.*”
    }
    }
    }

9. Match All Query (匹配所有文档)
  • 用于返回索引中的所有文档。

    {
    “query”: {
    “match_all”: {}
    }
    }

10. Term Range Query (字段范围查询)
  • 用于查询一个字段值在特定范围内的文档,类似 range query,但 term 查询是基于精确值的。

    {
    “query”: {
    “range”: {
    “field”: {
    “gte”: 5,
    “lte”: 10
    }
    }
    }
    }

11. Exists Query (字段存在查询)
  • 用于查询某个字段是否存在。

    {
    “query”: {
    “exists”: {
    “field”: “field_name”
    }
    }
    }

12. Geo Queries (地理位置查询)
  • Elasticsearch 支持基于地理位置的查询,如基于位置的范围查询或距离查询。

  • Geo Distance Query

    {
    “query”: {
    “bool”: {
    “filter”: {
    “geo_distance”: {
    “distance”: “200km”,
    “location”: {
    “lat”: 40.73,
    “lon”: -74.1
    }
    }
    }
    }
    }
    }

13. Aggregation (聚合查询)
  • Elasticsearch 提供了强大的聚合功能,可以对查询结果进行分组、统计等操作。

  • Terms Aggregation (分词聚合)

    {
    “aggs”: {
    “group_by_field”: {
    “terms”: {
    “field”: “field_name”
    }
    }
    }
    }

  • Range Aggregation (范围聚合)

    {
    “aggs”: {
    “price_ranges”: {
    “range”: {
    “field”: “price”,
    “ranges”: [
    { “to”: 100 },
    { “from”: 100, “to”: 200 },
    { “from”: 200 }
    ]
    }
    }
    }
    }

14. Highlighting (高亮查询)
  • 用于返回搜索结果中高亮显示匹配的字段。

    {
    “query”: {
    “match”: {
    “field”: “value”
    }
    },
    “highlight”: {
    “fields”: {
    “field”: {}
    }
    }
    }

15. Source Filtering (源字段过滤)
  • 用于控制哪些字段需要返回,哪些不需要返回。

    {
    “_source”: [“field1”, “field2”],
    “query”: {
    “match”: {
    “field”: “value”
    }
    }
    }

16. Prefix and Wildcard Query (前缀和通配符查询)
  • 用于对字段值进行前缀或通配符匹配,常用于实现补全或模糊搜索。

    {
    “query”: {
    “prefix”: {
    “field”: “prefix*”
    }
    }
    }


扩展*

匹配度查询

Elasticsearch 中,minimum_should_match 是布尔查询(bool query)的一部分,用于控制 should 子句的匹配度。should 子句的作用是定义一组可选条件,当文档满足其中至少一个条件时,它会被视为匹配。通过设置 minimum_should_match 参数,可以控制至少多少个 should 子句必须匹配,以提高查询的精度和灵活性。

1. 基本概念:
  • 在布尔查询中,should 子句表示可选条件。
  • 默认情况下,如果 bool 查询中有多个 should 子句,文档只需满足其中任何一个条件就可以匹配。
  • 使用 minimum_should_match 参数,可以要求文档至少满足某些数量的 should 子句,以增加查询的严格性。

例如:如果你有 5 个 should 子句,并设置 minimum_should_match 为 3,则文档必须满足其中至少 3 个 should 条件才能被视为匹配。

2. 用法:

minimum_should_match 可以设置为:

  • 整数值:指定最小匹配的 should 子句数量。
  • 百分比:指定至少要匹配的 should 子句的百分比。
  • 动态值:例如基于文档数量或其他复杂逻辑的动态匹配要求。
3. 示例:
(1) 简单的布尔查询 - 至少匹配 2 个 should 子句
{"query": {"bool": {"should": [{ "match": { "field1": "value1" } },{ "match": { "field2": "value2" } },{ "match": { "field3": "value3" } }],"minimum_should_match": 2  // 至少匹配 2 个 `should` 子句}}
}
  • 在这个例子中,文档需要匹配至少 2 个 should 子句(例如,匹配 field1field2 或者 field2field3)。
(2) 使用百分比的 minimum_should_match

如果你有多个 should 子句,可以通过百分比来控制匹配条件。例如,如果你有 5 个 should 子句,设置 minimum_should_match 为 60%,则至少需要满足 3 个子句。

{"query": {"bool": {"should": [{ "match": { "field1": "value1" } },{ "match": { "field2": "value2" } },{ "match": { "field3": "value3" } },{ "match": { "field4": "value4" } },{ "match": { "field5": "value5" } }],"minimum_should_match": "60%"  // 至少匹配 60% 的 `should` 子句 (即 3 个子句)}}
}
(3) 动态匹配 - 基于词数的 minimum_should_match

还可以根据查询中的词数设置 minimum_should_match,比如设置为 "3<80%",表示如果查询中有 3 个以上的 should 子句,则至少匹配其中 80%的子句。

{"query": {"bool": {"should": [{ "match": { "field1": "value1" } },{ "match": { "field2": "value2" } },{ "match": { "field3": "value3" } },{ "match": { "field4": "value4" } },{ "match": { "field5": "value5" } }],"minimum_should_match": "3<80%"  // 如果有超过 3 个 `should` 子句,至少匹配 80%}}
}
4. 如何决定 minimum_should_match
  • 业务需求:设置 minimum_should_match 的主要目的是根据业务需求平衡准确度和召回率。如果你需要更严格的匹配,增加 minimum_should_match 的值;如果需要更高的召回率,可以减少它。
  • 文档内容:在处理文档时,字段的长度、词汇密度、停用词等都可能影响查询的结果。可以通过实验和调整 minimum_should_match 来找到最适合的设置。
5. 示例:

假设你有以下文档数据:

{"field1": "apple orange banana","field2": "apple orange","field3": "banana"
}

你要查找包含 “apple”“orange” 的文档,并且需要设置 minimum_should_match 为 1。查询语句如下:

{"query": {"bool": {"should": [{ "match": { "field1": "apple" } },{ "match": { "field1": "orange" } },{ "match": { "field1": "banana" } }],"minimum_should_match": 1}}
}

在这个例子中,只要文档匹配一个 should 子句(比如 field1 包含 “apple” 或者 “orange”),就会被视为匹配。

6. 注意事项
  • minimum_should_match 在布尔查询中是可选的,只有当你使用了多个 should 子句时才有意义。
  • 设置的值越大,匹配条件越严格。通过调整 minimum_should_match 的值,可以灵活地调整查询的宽松程度。
  • minimum_should_match 参数可以通过数值、百分比、动态规则来设置,以适应不同的查询需求。
7. Match 查询的选项
(1) fuzziness:模糊匹配

如果你希望支持拼写错误或词语变化,可以使用 模糊查询。通过设置 fuzziness,Elasticsearch 会尝试匹配与查询词相似的词。

{"query": {"match": {"title": {"query": "Elasticsearh",  // 拼写错误"fuzziness": "AUTO"  // 自动模糊匹配}}}
}
  • fuzziness: "AUTO":根据查询词的长度自动设置模糊匹配的编辑距离。
  • fuzziness: "1":设置允许的最大编辑距离为 1(允许 1 个字符的更改,如替换、删除、插入)。
(2) minimum_should_match:最小匹配

在某些情况下,你可能想要求查询中至少匹配一个或多个词。minimum_should_match 可以控制需要匹配的最小词数。

{"query": {"match": {"content": {"query": "Elasticsearch tutorial advanced","minimum_should_match": 2  // 至少匹配 2 个词也可以用百分比替代示例:"60%"(指匹配总分词的百分比)}}}
}
  • minimum_should_match:设置至少要匹配多少个词。
(3) boost:提高某个词的匹配优先级

你可以通过 boost 来提高查询某些词的权重,使这些词匹配的文档更具优先级。

{"query": {"match": {"content": {"query": "Elasticsearch tutorial","boost": 2.0  // 增加查询的权重,使该查询匹配的文档优先返回}}}
}
  • boost:提高查询的匹配优先级,权重范围通常是 0 到 10,数值越大,匹配的优先级越高。
** match 查询常见问题**
(1) 如何处理大小写问题?

默认情况下,match 查询不区分大小写。Elasticsearch 会使用分词器(如 standard 分词器)将文本转为小写,因此可以处理大小写问题。

(2) match 查询与 term 查询的区别
  • match 查询:适用于文本字段的分词匹配,会分析查询文本并与字段内容进行分词对比。
  • term 查询:用于精确匹配,适用于不分词的字段(如 keyword 字段)。

聚合相关

在 Elasticsearch 中,**聚合(Aggregation)**是一个强大的功能,用于对查询结果进行分组、统计、度量等操作。聚合查询不仅可以按字段进行分组,还可以进行计算(如求和、平均值等),在数据分析和可视化中非常有用。聚合查询和普通查询(例如 matchrange 查询)是分开的,但可以结合使用。

1. 聚合查询的基本结构

聚合查询通常包含在 aggs(聚合)部分。在 Elasticsearch 中,聚合查询并不返回实际的文档,而是返回聚合结果,例如每个分组的文档数量、平均值、最大值等。

聚合查询的基本结构:

{"query": {"match": {"field": "value"}},"aggs": {"aggregation_name": {"aggregation_type": {"field": "field_name"}}}
}
2. 常见的聚合类型

以下是 Elasticsearch 中常见的聚合类型:

(1) Terms 聚合(分词聚合)

按字段值进行分组统计,返回每个字段值及其出现次数。常用于进行分组查询。

{"query": {"match_all": {}},"aggs": {"group_by_field": {"terms": {"field": "field_name"}}}
}

示例:
假设你有一个名为 category 的字段,你想按类别进行分组查询,统计每个类别的文档数量。

{"query": {"match_all": {}},"aggs": {"categories": {"terms": {"field": "category.keyword"  // 使用 .keyword 进行精确匹配}}}
}
(2) Range 聚合(范围聚合)

用于按指定的数值范围对文档进行分组。适用于数值、日期等字段。

{"query": {"match_all": {}},"aggs": {"price_ranges": {"range": {"field": "price","ranges": [{ "to": 50 },{ "from": 50, "to": 100 },{ "from": 100 }]}}}
}

示例:
假设你想要按价格进行分段统计,例如分为“低于 50”、“50 到 100”以及“大于 100”三个区间。

(3) Avg 聚合(平均值聚合)

用于计算字段的平均值。

{"query": {"match_all": {}},"aggs": {"average_price": {"avg": {"field": "price"}}}
}

示例:
计算 price 字段的平均值。

(4) Sum 聚合(求和聚合)

用于计算字段的总和。

{"query": {"match_all": {}},"aggs": {"total_price": {"sum": {"field": "price"}}}
}

示例:
计算 price 字段的总和。

(5) Max 和 Min 聚合(最大值和最小值聚合)

用于计算字段的最大值和最小值。

{"query": {"match_all": {}},"aggs": {"max_price": {"max": {"field": "price"}},"min_price": {"min": {"field": "price"}}}
}

示例:
计算 price 字段的最大值和最小值。

(6) Date Histogram 聚合(日期直方图聚合)

将日期数据按时间段进行分组,常用于按天、周、月等时间单位进行聚合。

{"query": {"match_all": {}},"aggs": {"sales_over_time": {"date_histogram": {"field": "timestamp","calendar_interval": "day"  // 按天分组}}}
}

示例:
按天统计销售数据。

(7) Top Hits 聚合(获取 top N 文档)

获取符合条件的 top N 文档,通常用于获取聚合组中的部分文档,适用于展示最高分的文档。

{"query": {"match_all": {}},"aggs": {"top_categories": {"terms": {"field": "category.keyword"},"aggs": {"top_hits": {"top_hits": {"size": 3  // 返回每个类别下的前 3 个文档}}}}}
}
(8) Cardinality 聚合(基数聚合)

用于计算字段的基数(去重后的唯一值数量)。例如,统计不同的用户数或产品数。

{"query": {"match_all": {}},"aggs": {"unique_users": {"cardinality": {"field": "user_id"}}}
}

示例:
计算 user_id 字段中不重复的用户数量。

3. 聚合嵌套

聚合查询不仅可以进行单一聚合,还可以进行嵌套聚合,即在一个聚合的结果上进行进一步的聚合。下面是一个例子,展示如何在一个 terms 聚合的每个分组上执行进一步的聚合:

{"query": {"match_all": {}},"aggs": {"categories": {"terms": {"field": "category.keyword"},"aggs": {"avg_price": {"avg": {"field": "price"}}}}}
}

示例:
先按 category 分组,再计算每个类别的平均价格。

4. 聚合结果的格式

聚合查询的结果会包含在 aggregations(或 aggs)字段中。结果结构通常类似于下面的格式:

{"aggregations": {"categories": {"buckets": [{"key": "electronics",  // 分组的字段值"doc_count": 100,      // 每个分组的文档数量"avg_price": {"value": 300         // 每个分组的聚合结果,如平均价格}},{"key": "clothing","doc_count": 80,"avg_price": {"value": 50}}]}}
}

聚合结果:

  • buckets:每个分组的结果集合。
  • key:分组的字段值。
  • doc_count:该分组中的文档数量。
  • 聚合结果(例如 avg_price):聚合操作的结果。
5. 聚合的性能优化
  • 避免过多的 terms 聚合terms 聚合会对字段值进行分组,可能会消耗大量内存和计算资源。对于高基数字段(如用户ID),考虑限制返回的分组数量。
  • 限制返回的文档数量:可以通过 size 参数来限制每个分组返回的文档数量,避免过多数据返回。
  • 减少聚合的嵌套深度:过多层次的嵌套聚合会增加 Elasticsearch 的计算负担,尽量保持聚合的平面结构。

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

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

相关文章

WinHttp API接口辅助类实现GET POST网络通讯

1、简述 近期需要在MFC基础上开发网络Http通讯,开始使用的WinINet进行通讯,后面发现WinINet对连接超时这块不支持设置,在网上搜索了几种方式效果都不太好,于是决定用WinHttp API接口进行通讯,分别对GET、POST进行了封装。 2、使用到接口 2.1、WinHttpOpen WinHttpOpen 是…

Js:DOM中的样式(包含行内样式、滚动样式、可见区域样式等)

这部分还在更新 1、 获取行内样式&#xff1a;元素.style.样式名称 2、 获取当前正在显示的样式&#xff08;只能读&#xff0c;不能修改&#xff0c;想要修改要使用style&#xff09;&#xff1a; ① 只有ie支持&#xff1a;元素.currentStyle.样式名称 ② 其他浏览器&…

《Long Context Compression with Activation Beacon》笔记

Activation Beacon出自智源与人大在2024年1月放在arxiv上的论文《Long Context Compression with Activation Beacon》(v1版的题目&#xff1a;Soaring from 4K to 400K: Extending LLM’s Context with Activation Beacon&#xff09;。它引入了Beacon token将上下文信息蒸馏到…

线程池 | java中的多线程

在 《Java异步编程 | CompletableFuture--实现复杂的异步控制流 》中&#xff0c;我们提到了 通过 自定义线程池 &#xff0c; 用于管理 异步任务的执行&#xff0c;避免频繁创建和销毁线程&#xff0c;提高性能。 本文将整理并介绍一些 Java 中常见的 多线程创建方式&#xf…

Javaweb之css

css的三种引入方式 1内行式 2.内嵌式 3.外部样式表 内行式和内嵌式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…

SQLmap 注入-03 获得用户信息

1: Sqlmap 先进入库&#xff0c;然后进入table, 然后列出column: sqlmap -u "http://192.168.56.133/mutillidae/index.php?pageuser-info.php&usernamexiaosheng&passwordabc&user-info-php-submit-buttonViewAccountDetails" --batch -p username -D …

mac 安装 python2

官网下载2.7&#xff1a; Python Release Python 2.7.18 | Python.org 查找地址&#xff1a; which python2 # /usr/local/bin/python2 设置 npm 使用 Python 2&#xff08;新建窗口&#xff09;&#xff1a; npm config set python /usr/local/bin/python2 验证 Python 版…

Jupyter notebook中运行dos指令运行方法

Jupyter notebook中运行dos指令运行方法 目录 Jupyter notebook中运行dos指令运行方法一、DOS(磁盘操作系统&#xff09;指令介绍1.1 DOS介绍1.2 DOS指令1.2.1 DIR - 显示当前目录下的文件和子目录列表。1.2.2 CD 或 CHDIR - 改变当前目录1.2.3 使用 CD .. 可以返回上一级目录1…

基于注解实现去重表消息防止重复消费

基于注解实现去重表消息防止重复消费 1. 背景/问题 在分布式系统中&#xff0c;消息队列&#xff08;如RocketMQ、Kafka&#xff09;的 消息重复消费 是常见问题&#xff0c;主要原因包括&#xff1a; 网络抖动&#xff1a;生产者或消费者因网络不稳定触发消息重发。消费者超…

Biotin sulfo-N-hydroxysuccinimide ester ;生物素磺基-N-羟基琥珀酰亚胺酯;生物素衍生物;190598-55-1

一、生物素及其衍生物的概述 生物素衍生物是指在生物素&#xff08;Vitamin H或B7&#xff09;分子基础上进行化学修饰得到的衍生化合物。这些衍生化合物在生物医学研究、临床诊断和药物开发等领域有着广泛的应用。 生物素&#xff08;Biotin&#xff09;是一种水溶性维生素&a…

Ubuntu如何安装redis服务?

环境&#xff1a; Ubuntu22.04 WSL2 问题描述&#xff1a; 如何安装redis服务&#xff1f; 解决方案&#xff1a; 1.在 Linux 上&#xff08;如 Ubuntu/Debian&#xff09;安装 1.通过包管理工具安装 Redis 服务器&#xff1a; sudo apt update sudo apt install redis…

Datawhale组队学习笔记task2——leetcode面试题

文章目录 写在前面Day5题目1.0112.路径总和解答2.0113路径总和II解答3.0101.对称二叉树解答 Day6题目1.0124.二叉树中的最大路径和解答2.0199.二叉树的右视图解答3.0226.翻转二叉树解答 Day7题目1.0105.从前序与中序遍历序列构造二叉树解答2.0098.验证二叉搜索树解答3.0110.平衡…

Slate文档编辑器-Node节点与Path路径映射

Slate文档编辑器-Node节点与Path路径映射 在之前我们聊到了slate中的Decorator装饰器实现&#xff0c;装饰器可以为我们方便地在编辑器渲染调度时处理range的渲染&#xff0c;这在实现搜索替换、代码高亮等场景非常有用。那么在这篇文章中&#xff0c;我们聊一下Node节点与Pat…

麒麟系统中删除权限不够的文件方法

在麒麟系统中删除权限不够的文件&#xff0c;可以尝试以下几种方法&#xff1a; 通过修改文件权限删除 打开终端&#xff1a;点击左下角的“终端”图标&#xff0c;或者通过搜索功能找到并打开终端 。定位文件&#xff1a;使用cd命令切换到文件所在的目录 。修改文件权限&…

Kotlin语言的正则表达式

Kotlin语言中的正则表达式 引言 正则表达式作为一种强大的文本处理工具&#xff0c;广泛应用于字符串匹配、数据验证、文本搜索等场景。在Kotlin语言中&#xff0c;正则表达式的应用同样得到了广泛关注。Kotlin不仅具备与Java相同的正则表达式功能优势&#xff0c;还提供了更…

Flask简介与安装以及实现一个糕点店的简单流程

目录 1. Flask简介 1.1 Flask的核心特点 1.2 Flask的基本结构 1.3 Flask的常见用法 1.3.1 创建Flask应用 1.3.2 路由和视图函数 1.3.3 动态URL参数 1.3.4 使用模板 1.4 Flask的优点 1.5 总结 2. Flask 环境创建 2.1 创建虚拟环境 2.2 激活虚拟环境 1.3 安装Flask…

RFID系统安全认证协议及防碰撞算法研究(RFID Security)

目录 1.摘要 2.引言 3.前人研究成果 3.1 RFID系统协议模型 3.2 RFID系统安全认证协议分类 3.3 RFID安全认证协议及其研究 3.3.1 超轻量级安全认证协议及其研究 3.3.2 轻量级安全认证协议及其研究 3.3.2 中量级安全认证协议及其研究 3.3.3 重量级安全认证协议及其研究…

Docker 实现MySQL 主从复制

一、拉取镜像 docker pull mysql:5.7相关命令&#xff1a; 查看镜像&#xff1a;docker images 二、启动镜像 启动mysql01、02容器&#xff1a; docker run -d -p 3310:3306 -v /root/mysql/node-1/config:/etc/mysql/ -v /root/mysql/node-1/data:/var/lib/mysql -e MYS…

Spring MVC:设置响应

目录 引言 1. 返回静态页面 1.1 Spring 默认扫描路径 1.2 RestController 1.2.1 Controller > 返回页面 1.2.2 ResponseBody 2. 返回 HTML 2.1 RequestMapping 2.1.1 produces(修改响应的 Content-Type) 2.1.2 其他属性 3. 返回 JSON 4. 设置状态码 4.1 HttpSer…

在Windows/Linux/MacOS C++程序中打印崩溃调用栈和局部变量信息

打印崩溃调用栈和局部变量信息的方法有所不同。以下是针对 Windows、Linux 和 MacOS 的示例代码。 Windows 在 Windows 上&#xff0c;可以使用 Windows API 来捕获异常并打印调用栈。 #include <windows.h> #include <DbgHelp.h> #include <stdio.h> #in…