Elasticsearch Intervals Query 深度解析
elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch
什么是Intervals Query
Intervals Query是Elasticsearch中一种高级查询方式,它允许开发者基于词项的顺序和邻近度来匹配文档。与传统的全文搜索不同,Intervals Query提供了更精细的控制能力,可以精确指定词项之间的位置关系和顺序。
核心概念
Intervals Query的核心是匹配规则系统,它由一组定义构成,这些规则会被应用到指定字段的词项上。系统会生成文本中跨越词项的最小间隔序列,这些间隔可以进一步通过父源进行组合和过滤。
基本用法示例
下面是一个典型的Intervals Query示例,它会在my_text
字段中查找:
- 紧密相连的"my favorite food"(不允许有间隔)
- 后面跟着"hot water"或"cold porridge"
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"all_of" : {
"ordered" : true,
"intervals" : [
{
"match" : {
"query" : "my favorite food",
"max_gaps" : 0,
"ordered" : true
}
},
{
"any_of" : {
"intervals" : [
{ "match" : { "query" : "hot water" } },
{ "match" : { "query" : "cold porridge" } }
]
}
}
]
}
}
}
}
}
这个查询会匹配"my favorite food is cold porridge"这样的文本,但不会匹配"when it's cold my favorite food is porridge"。
规则类型详解
1. match规则
match规则用于匹配分析后的文本,是最常用的规则类型。
主要参数:
query
:必需,要查找的文本max_gaps
:可选,匹配词项之间的最大间隔位置数,默认-1(无限制)ordered
:可选,是否要求词项按顺序出现,默认falseanalyzer
:可选,用于分析查询文本的分析器use_field
:可选,指定从哪个字段匹配而非顶层字段
2. prefix规则
prefix规则匹配以指定字符开头的词项。
特点:
- 最多匹配128个扩展词项
- 可通过字段映射中的
index-prefixes
选项避免限制
主要参数:
prefix
:必需,词项的开头字符analyzer
:可选,用于规范化前缀的分析器
3. wildcard规则
wildcard规则使用通配符模式匹配词项。
通配符支持:
?
:匹配任意单个字符*
:匹配零个或多个字符
注意:避免以*
或?
开头的模式,这会显著降低搜索性能。
4. fuzzy规则
fuzzy规则匹配与提供词项相似的词项,基于编辑距离。
主要参数:
term
:必需,要匹配的词项fuzziness
:可选,最大编辑距离prefix_length
:可选,开头不变化的字符数transpositions
:可选,是否允许相邻字符转置
5. all_of规则
all_of规则组合多个规则,要求所有规则都匹配。
主要参数:
intervals
:必需,要组合的规则数组max_gaps
:可选,规则间最大间隔ordered
:可选,是否要求按顺序出现
6. any_of规则
any_of规则匹配任意子规则产生的间隔。
高级过滤功能
Intervals Query提供了强大的过滤功能,可以在匹配基础上进一步筛选结果。
过滤类型:
after
:匹配在过滤间隔之后的间隔before
:匹配在过滤间隔之前的间隔contained_by
:匹配被过滤间隔包含的间隔containing
:匹配包含过滤间隔的间隔not_*
:上述条件的反向版本
过滤示例
查找"hot"和"porridge"在10个位置内出现,且中间不包含"salty"的文档:
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"match" : {
"query" : "hot porridge",
"max_gaps" : 10,
"filter" : {
"not_containing" : {
"match" : {
"query" : "salty"
}
}
}
}
}
}
}
}
脚本过滤
可以使用脚本基于间隔的开始位置、结束位置和内部间隔数进行过滤:
POST _search
{
"query": {
"intervals" : {
"my_text" : {
"match" : {
"query" : "hot porridge",
"filter" : {
"script" : {
"source" : "interval.start > 10 && interval.end < 20 && interval.gaps == 0"
}
}
}
}
}
}
}
重要注意事项
-
间隔最小化:Intervals Query总是最小化间隔以保证线性时间查询,这有时会导致意外结果,特别是在使用
max_gaps
限制或过滤器时。 -
规则重叠:当
any_of
规则包含重叠的子规则时,特别是当一个规则是另一个规则的严格前缀时,较长的规则可能永远不会匹配。 -
查询重写:在某些复杂情况下,最好将查询重写为顶层明确列出所有选项的形式,而不是依赖嵌套规则。
最佳实践
-
对于精确短语匹配,使用
match
规则并设置ordered:true
和max_gaps:0
-
当需要灵活性时,适当调整
max_gaps
值 -
避免过于复杂的嵌套规则结构,必要时拆分为多个查询
-
对性能敏感的场景,谨慎使用通配符和模糊查询
Intervals Query为Elasticsearch提供了强大的文本位置关系查询能力,特别适合需要精确控制词项顺序和邻近度的场景。通过合理组合各种规则和过滤器,可以实现非常精细的文本匹配需求。
elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考