当前位置: 首页 > article >正文

【Elasticsearch复合查询】

Elasticsearch复合查询

在Elasticsearch中,复合查询(Compound Queries)是用来封装其他复合查询或叶子查询的查询类型。它们的主要目的是组合这些查询的结果和分数、改变它们的行为或者从查询上下文切换到过滤上下文。

一个常见的复合查询是bool查询,它允许你通过布尔逻辑组合多个查询条件。bool查询包含以下几种子句:

  • must: 文档必须匹配所有must子句下的查询条件,并且这些匹配会影响到文档的相关性评分。
  • should: 文档可以匹配should子句下的一个或多个查询条件,这会增加文档的相关性评分。如果没有任何must子句存在,至少需要满足一个should子句。
  • must_not: 文档不能匹配任何must_not子句下的查询条件。这个子句不会影响评分,它的作用是排除不相关的文档。
  • filter: 文档必须匹配filter子句下的查询条件,但与must不同的是,filter子句不会影响文档的评分,只起到过滤的作用。

除了bool查询之外,还有其他的复合查询类型,例如:

  • constant_score 查询:将原始查询转换为不计算评分的过滤查询,并给所有匹配的文档赋予相同的评分。
  • dis_max 查询:用于指定一个查询中的多个子查询,并返回那些单个最佳匹配子查询得分最高的文档。
  • function_score 查询:允许你修改查询结果的评分,可以通过定义不同的函数来调整最终的评分。

代码示例

1. bool 查询

bool 查询是使用最广泛的复合查询之一。它允许你通过布尔逻辑组合多个查询条件。

  • must: 文档必须匹配这些条件,相当于 AND。
  • filter: 必须匹配,但不计算相关性分数。
  • should: 文档应该匹配这些条件中的至少一个,增加其相关性分数。
  • must_not: 文档不能匹配这些条件。

示例代码:

{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "user" : "kimchy" }
      },
      "filter": {
        "term" : { "tag" : "tech" }
      },
      "must_not" : {
        "range" : {
          "age" : { "from" : 10, "to" : 20 }
        }
      },
      "should" : [
        { "term" : { "comment" : "cool" } },
        { "term" : { "comment" : "wonderful" } }
      ]
    }
  }
}
2. dis_max 查询

dis_max 查询会选择单个最佳匹配的查询子句来计算最终分数,而不是像 bool 查询那样合并所有匹配子句的分数。

示例代码:

{
  "query": {
    "dis_max" : {
      "queries" : [
        { "match" : { "title" : "Quick pets" }},
        { "match" : { "body" : "Quick pets" }}
      ],
      "tie_breaker" : 0.7
    }
  }
}
3. function_score 查询

function_score 允许你修改查询结果的评分,根据特定的函数调整每个文档的最终评分。

示例代码:

{
  "query": {
    "function_score": {
      "query": { "match_all": {} },
      "functions": [
        {
          "filter": { "match": { "test": "bar" }},
          "weight": 23
        },
        {
          "filter": { "match": { "test": "cat" }},
          "weight": 42
        }
      ],
      "score_mode": "max",
      "boost_mode": "multiply"
    }
  }
}

使用复合查询可以帮助你构建复杂的搜索逻辑,以精确地控制哪些文档应该被检索出来以及如何对它们进行排序。根据你的具体需求,你可以选择合适的复合查询类型来实现你的查询目标。


http://www.kler.cn/a/505444.html

相关文章:

  • Realsense相机驱动安装及其ROS通讯配置——机器人抓取系统基础系列(四)
  • 《leetcode-runner》如何手搓一个debug调试器——指令系统
  • 低代码独特架构带来的编译难点及多线程解决方案
  • Prompt工程框架介绍与场景选择
  • css实现响应式详解
  • 浅谈云计算15 | 存储可靠性技术(RAID)
  • 基于spingboot+html技术的博客网站
  • 1.1.1 C语言常用的一些函数(持续更新)
  • 最好用的图文识别OCR -- PaddleOCR(4) 模型微调
  • 【JVM中的三色标记法是什么?】
  • ssh, git 配置多对公私钥
  • 简识MySQL中ReadView、RC、RR的关系
  • 二级缓存(缓存到Redis)
  • Electron 开发者的 Tauri 2.0 实战指南:文件系统操作
  • LeetCode热题100(三十四) —— 23.合并K个升序链表
  • git报错处理
  • linux服务器 常用脚本(超全)
  • SpringBoot项目中解决CORS跨域资源共享问题
  • 比较分析:Windsurf、Cody、Cline、Roo Cline、Copilot 和 通义灵码
  • hadoop3.3和hive4.0安装——单节点
  • ubuntu如何搭建ftp
  • MAP评价指标在Faster R-CNN中的使用
  • macOS 如何终止端口占用的进程 ?
  • 【Linux网络编程】高效I/O--I/O的五种类型
  • 【机器人】复现SceneGrasp 同时支持多目标 3D物体重建、6DoF位姿估计、抓取预测
  • Blazor中Syncfusion图像编辑器组件使用方法