【Elasticsearch】 Compound Queries

news/2025/2/4 17:31:52/

Elasticsearch Compound Queries

Elasticsearch 的 Compound Queries 是一种强大的工具,用于组合多个查询子句,以实现更复杂的搜索逻辑。这些查询子句可以是叶查询(Leaf Queries)或复合查询(Compound Queries),并且可以用于组合结果和分数、改变行为或从查询上下文切换到过滤上下文。

主要的复合查询类型

  1. bool 查询

    • 用于组合多个叶查询或复合查询子句,支持 mustshouldmust_notfilter 子句。mustshould 子句的分数会被合并,而 must_notfilter 子句在过滤上下文中执行。

    JSON复制

    GET /products/_search
    {"query": {"bool": {"must": [{ "match": { "description": "wireless headphones" } }],"filter": [{ "term": { "brand": "BrandA" } }],"should": [{ "range": { "price": { "lte": 100 } } }],"must_not": [{ "term": { "color": "red" } }]}}
    }
  2. boosting 查询

    • 返回匹配 positive 查询的文档,但会降低也匹配 negative 查询的文档的分数。

    JSON复制

    {"query": {"boosting": {"positive": { "match": { "content": "multiple queries" }},"negative": { "term": { "status": "archived" }},"negative_boost": 0.5}}
    }
  3. constant_score 查询

    • 包装另一个查询,但在过滤上下文中执行它。所有匹配的文档都将获得相同的“常量” _score

  4. dis_max 查询

    • 接受多个查询,并返回匹配任何查询子句的文档。与 bool 查询合并所有匹配查询的分数不同,dis_max 查询使用单个最佳匹配查询子句的分数。

    JSON复制

    {"query": {"dis_max": {"queries": [{ "match": { "name": "kimchy" }},{ "match": { "name": "elasticsearch" }}],"boost": 1.2,"tie_breaker": 0.7}}
    }
  5. function_score 查询

    • 使用函数修改主查询返回的分数,考虑因素如流行度、最近性、距离或通过脚本实现的自定义算法。

    JSON复制

    {"query": {"function_score": {"query": { "match": { "name": "kimchy" }},"functions": [{ "random_score": { "seed": 1234 }},{ "exponential_decay": { "field": "age", "origin": 0, "scale": 1 }}],"score_mode": "multiply"}}
    }

使用场景

  • 组合多个条件:使用 bool 查询组合多个搜索条件,例如同时匹配多个字段。

  • 调整查询权重:使用 boosting 查询调整某些文档的权重。

  • 固定分数:使用 constant_score 查询为所有匹配文档分配固定分数。

  • 选择最佳匹配:使用 dis_max 查询选择最佳匹配的查询子句。

  • 自定义评分:使用 function_score 查询根据自定义逻辑调整文档分数。

通过合理使用这些复合查询,您可以构建更复杂、更灵活的搜索逻辑,以满足不同的业务需求。


http://www.ppmy.cn/news/1569288.html

相关文章

Baklib推动数字化内容管理解决方案助力企业数字化转型

内容概要 在当今信息爆炸的时代,数字化内容管理成为企业提升效率和竞争力的关键。企业在面对大量数据时,如何高效地存储、分类与检索信息,直接关系到其经营的成败。数字化内容管理不仅限于简单的文档存储,更是整合了文档、图像、…

Linux进阶——时间服务器

NTP是网络时间协议(network time protocol)的简称(应用层的协议),通过UDP123端口进行网络时钟同步。 Chrony是一个开源自由的网络时间协议NTP的客户端和服务器软件。它能让计算机保持系统时钟与时钟服务器&#xff08…

2025年1月个人工作生活总结

本文为 2025年1月工作生活总结。 研发编码 使用sqlite3命令行查询表数据 可以直接使用sqlite3查询数据表,不需进入命令行模式。示例如下: sqlite3 database_name.db "SELECT * FROM table_name;"linux shell使用read超时一例 先前有个编译…

【C语言篇】“三子棋”

一、游戏介绍 三子棋,英文名为 Tic - Tac - Toe,是一款简单而经典的棋类游戏。游戏在一个 33 的棋盘上进行,两名玩家轮流在棋盘的空位上放置自己的棋子(通常用 * 和 # 表示),率先在横、竖或斜方向上连成三个…

编程AI深度实战:AI编程工具哪个好? Copilot vs Cursor vs Cody vs Supermaven vs Aider

​ 系列文章: 编程AI深度实战:私有模型deep seek r1,必会ollama-CSDN博客 编程AI深度实战:自己的AI,必会LangChain-CSDN博客 编程AI深度实战:给vim装上AI-CSDN博客 编程AI深度实战:火的编程…

数据分析系列--⑥RapidMiner构建决策树(泰坦尼克号案例含数据)

一、资源下载 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 2.划分训练集和测试集 3.应用模型 4.结果分析 一、资源下载 点击下载数据集 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 虽然决策树已经构建,但对于大多数初学者或…

Android Studio:视图绑定的岁月变迁(2/100)

一、博文导读 本文是基于Android Studio真实项目,通过解析源码了解真实应用场景,写文的视角和读者是同步的,想到看到写到,没有上帝视角。 前期回顾,本文是第二期。 private Unbinder mUnbinder; 只是声明了一个 接口…

笔试-业务逻辑4

应用 小明在玩一个数字加减游戏&#xff0c;输入4个正整数&#xff1a;s、t、a、b&#xff0c;其中s>1&#xff0c;b<105&#xff0c;a!b。只使用加法或者减法&#xff0c;使得st。 每回合&#xff0c;小明用当前的数字&#xff0c;加上或减去一个数字&#xff1b;目前有…