【Elasticsearch】intervals查询

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`查询。

相关推荐
java 凯5 小时前
Ubuntu 上安装 Elasticsearch 7.6.0
ubuntu·elasticsearch·jenkins
勿忘初心915 小时前
Android车机DIY开发之软件篇(十二) AOSP12下载编译
android·大数据·arm开发·嵌入式硬件·elasticsearch
risc1234567 小时前
【Elasticsearch】文本分析Text analysis概述
elasticsearch
risc12345615 小时前
【Elasticsearch】Bucket Selector Aggregation
elasticsearch
risc12345615 小时前
【Elasticsearch】derivative聚合
elasticsearch
Elastic 中国社区官方博客15 小时前
如何在 Elasticsearch 中设置向量搜索 - 第二部分
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
信徒_16 小时前
ES 索引结构
大数据·elasticsearch·搜索引擎
risc12345617 小时前
【Elasticsearch】bucket_sort
elasticsearch
risc1234561 天前
【Elasticsearch】cumulative_cardinality
elasticsearch