【Elasticsearch】intervals查询

devtools/2025/2/13 6:32:08/

Elasticsearch 的`intervals`查询详解

`intervals`查询是 Elasticsearch 中一种强大的查询工具,用于基于术语的顺序和接近度来匹配文档。它特别适合需要精确控制术语位置和顺序的场景,例如法律或专利搜索。从 Elasticsearch v8.16 开始,`intervals`查询得到了进一步增强,支持更多功能,如`range`和`regexp`规则。


1.`intervals`查询的基本结构
`intervals`查询的基本结构如下:

```json
{
  "query": {
    "intervals": {
      "<field>": {
        "<rule>": {
          "intervals": [
            { "match": { "query": "<text>" } }
          ]
        }
      }
    }
  }
}
```


• `<field>`:指定要搜索的字段。

• `<rule>`:定义匹配规则,如`match`、`all_of`、`any_of`等。

• `<text>`:要匹配的文本内容。


2.常用参数和规则


2.1`match`规则
`match`规则是`intervals`查询中最基本的规则,用于匹配分析后的文本。


• `query`:必需,指定要匹配的文本。

• `max_gaps`:可选,指定匹配项之间的最大间隔数。默认值为`-1`,表示没有限制。如果设置为`0`,则术语必须紧挨着。

• `ordered`:可选,指定匹配项是否必须按指定顺序出现。默认值为`false`。

• `analyzer`:可选,指定用于分析查询文本的分析器。默认使用字段的默认分析器。

示例:

```json
POST _search
{
  "query": {
    "intervals": {
      "my_text": {
        "match": {
          "query": "my favorite food",
          "max_gaps": 0,
          "ordered": true
        }
      }
    }
  }
}
```

这个查询会匹配包含“my favorite food”且术语紧挨着的文档。


2.2`all_of`规则
`all_of`规则用于组合多个规则,要求所有规则都匹配。


• `ordered`:可选,指定规则是否必须按指定顺序出现。默认值为`false`。

• `max_gaps`:可选,指定规则之间的最大间隔数。默认值为`-1`,表示没有限制。

示例:

```json
POST _search
{
  "query": {
    "intervals": {
      "my_text": {
        "all_of": {
          "ordered": true,
          "intervals": [
            { "match": { "query": "if you go down to the woods" } },
            { "match": { "query": "big surprise" } }
          ]
        }
      }
    }
  }
}
```

这个查询会匹配包含“if you go down to the woods”后跟“big surprise”的文档,且术语必须按顺序出现。


2.3`any_of`规则
`any_of`规则用于组合多个规则,只要其中一个规则匹配即可。

示例:

```json
POST _search
{
  "query": {
    "intervals": {
      "my_text": {
        "all_of": {
          "ordered": true,
          "intervals": [
            { "match": { "query": "if you go down to the woods" } },
            {
              "any_of": {
                "intervals": [
                  { "match": { "query": "big surprise" } },
                  { "match": { "query": "eyes" } }
                ]
              }
            }
          ]
        }
      }
    }
  }
}
```

这个查询会匹配包含“if you go down to the woods”后跟“big surprise”或“eyes”的文档。


2.4`filter`规则
`filter`规则用于对匹配结果进行进一步过滤。


• `not_containing`:排除包含特定术语的匹配结果。

• `script`:使用脚本对匹配结果进行过滤。

示例:

```json
POST _search
{
  "query": {
    "intervals": {
      "my_text": {
        "match": {
          "query": "reconstruction substations",
          "max_gaps": 9,
          "filter": {
            "not_containing": {
              "match": { "query": "heating" }
            }
          }
        }
      }
    }
  }
}
```

这个查询会匹配包含“reconstruction substations”且中间不超过9个位置的文档,但不包含“heating”。


3.使用脚本过滤
`intervals`查询支持使用脚本对匹配结果进行过滤,基于间隔的起始位置、结束位置和间隔数。

示例:

```json
POST _search
{
  "query": {
    "intervals": {
      "my_text": {
        "match": {
          "query": "hot meal",
          "filter": {
            "script": {
              "source": "interval.start > 5 && interval.end < 30 && interval.gaps == 0"
            }
          }
        }
      }
    }
  }
}
```

这个查询会匹配包含“hot meal”且匹配间隔的起始位置大于5、结束位置小于30、间隔数为0的文档。


4.注意事项

• `any_of`和`all_of`的组合:在使用`any_of`和`all_of`时,需要注意术语的顺序和间隔。例如,如果`any_of`中的术语是另一个术语的前缀,可能会导致意外的结果。

• 性能优化:`intervals`查询在处理复杂逻辑时可能会比简单的`match_phrase`查询稍慢,但在需要精确控制术语位置时非常有用。


总结
`intervals`查询是 Elasticsearch 中一种强大的工具,特别适合需要精确控制术语位置和顺序的场景。通过合理使用`match`、`all_of`、`any_of`和`filter`等规则,可以实现复杂的匹配逻辑。希望这些示例和解释能帮助你更好地理解和使用`intervals`查询。


http://www.ppmy.cn/devtools/158406.html

相关文章

16.React学习笔记.React更新机制

一. 发生更新的时机以及顺序## image.png props/state改变render函数重新执行产生新的VDOM树新旧DOM树进行diff计算出差异进行更新更新到真实的DOM 二. React更新流程## React将最好的O(n^3)的tree比较算法优化为O(n)。 同层节点之间相互比较&#xff0c;不跨节点。不同类型的节…

从基础到人脸识别与目标检测

前言 从本文开始&#xff0c;我们将开始学习ROS机器视觉处理&#xff0c;刚开始先学习一部分外围的知识&#xff0c;为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本&#xff0c;系统采用Ubuntu20.04&#xff0c;ROS采用noetic。 颜…

迅为RK3568开发板篇OpenHarmony实操HDF驱动配置LED-LED测试

将编译好的镜像全部进行烧写&#xff0c;镜像在源码根目录 out/rk3568/packages/phone/images/目录下。 烧写完成之后&#xff0c;在调试串口查看打印日志&#xff0c;如下图所示&#xff1a; 然后打开 hdc 工具&#xff0c;运行测试程序&#xff0c;输入“led_test 1”&…

sql难点

一、 假设你有一个查询&#xff0c;需要根据 id 是否为 null 来动态生成 SQL 条件&#xff1a; xml复制 <select id"getResources" resultType"Resource">SELECT * FROM resources<where><if test"id ! null">and id <!…

Flutter PIP 插件 ---- iOS Video Call

以下是一篇关于在 iOS 中实现画中画(PiP)功能的技术博客: iOS 画中画(PiP)功能实现指南 简介 画中画(Picture in Picture, PiP)是一项允许用户在使用其他应用时继续观看视频内容的功能。本文将详细介绍如何在 iOS 应用中实现 PiP 功能。 系统要求 iOS 15.0 及以上版本AVKi…

Python:凯撒密码

题目内容&#xff1a; 凯撒密码是古罗马恺撒大帝用来对军事情报进行加密的算法&#xff0c;它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列该字符后面第三个字符&#xff0c;对应关系如下&#xff1a; 原文&#xff1a;A B C D E F G H I J K L M N O P Q R …

OpenVINO 2025.0重磅升级:开启⽣成式AI全场景⾰命!

2025年2⽉6⽇&#xff0c;英特尔OpenVINO™ 2025.0版本震撼发布&#xff0c;本次升级堪称近三年最⼤规模技术⾰新&#xff01;从⽣成 式AI性能跃升到全栈硬件⽀持&#xff0c;从开发者⼯具链优化到边缘计算突破&#xff0c;六⼤核⼼升级重新定义AI部署效率。 一&#xff0c;&a…

Flink-序列化

一、概述 几乎每个Flink作业都必须在其运算符之间交换数据&#xff0c;由于这些记录不仅可以发送到同一JVM中的另一个实例&#xff0c;还可以发送到单独的进程&#xff0c;因此需要先将记录序列化为字节。类似地&#xff0c;Flink的堆外状态后端基于本地嵌入式RocksDB实例&…