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

相关推荐
INFINI Labs18 小时前
Easysearch analysis-ik 多词典性能优化:从性能回退到分词性能提升 25%~30%
elasticsearch·性能优化·分词·performance·easysearch·ik
IT飞牛19 小时前
Elasticsearch 技术调研与实践
大数据·elasticsearch·搜索引擎
从此以后自律19 小时前
Git一篇
大数据·elasticsearch·搜索引擎
超人也会哭️呀19 小时前
ES 混合检索(文本+向量)中的条件处理陷阱——当权限过滤遇到关键词查询
android·大数据·elasticsearch
做个文艺程序员1 天前
第03篇:深入 Mapping 与数据类型设计——ES Schema 设计避坑指南
大数据·elasticsearch·搜索引擎·mapping设计
铭毅天下1 天前
Easysearch 版本进化全图——从 ES 国产替代到 AI Native 搜索数据库
大数据·数据库·人工智能·elasticsearch·搜索引擎
Elastic 中国社区官方博客2 天前
在 Elasticsearch 中,存储向量查询速度最高提升 3 倍
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索
海兰2 天前
从原始日志到系统知识:补齐 AI 可观测性的“上下文层“
人工智能·elasticsearch
逆境不可逃2 天前
【与我学 ClaudeCode】规划与协调篇 之 Skills:按需加载的领域知识框架
大数据·人工智能·elasticsearch·搜索引擎·agent·claudecode
奋斗的老史2 天前
LangChain4j + Elasticsearch 实现企业级向量存储(支持混合检索、元数据过滤)
elasticsearch·langchain4j