Elasticsearch Intervals Query 深度解析

Elasticsearch Intervals Query 深度解析

elasticsearch elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch

什么是Intervals Query

Intervals Query是Elasticsearch中一种高级查询方式,它允许开发者基于词项的顺序和邻近度来匹配文档。与传统的全文搜索不同,Intervals Query提供了更精细的控制能力,可以精确指定词项之间的位置关系和顺序。

核心概念

Intervals Query的核心是匹配规则系统,它由一组定义构成,这些规则会被应用到指定字段的词项上。系统会生成文本中跨越词项的最小间隔序列,这些间隔可以进一步通过父源进行组合和过滤。

基本用法示例

下面是一个典型的Intervals Query示例,它会在my_text字段中查找:

  1. 紧密相连的"my favorite food"(不允许有间隔)
  2. 后面跟着"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:可选,是否要求词项按顺序出现,默认false
  • analyzer:可选,用于分析查询文本的分析器
  • 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"
            }
          }
        }
      }
    }
  }
}

重要注意事项

  1. 间隔最小化:Intervals Query总是最小化间隔以保证线性时间查询,这有时会导致意外结果,特别是在使用max_gaps限制或过滤器时。

  2. 规则重叠:当any_of规则包含重叠的子规则时,特别是当一个规则是另一个规则的严格前缀时,较长的规则可能永远不会匹配。

  3. 查询重写:在某些复杂情况下,最好将查询重写为顶层明确列出所有选项的形式,而不是依赖嵌套规则。

最佳实践

  1. 对于精确短语匹配,使用match规则并设置ordered:truemax_gaps:0

  2. 当需要灵活性时,适当调整max_gaps

  3. 避免过于复杂的嵌套规则结构,必要时拆分为多个查询

  4. 对性能敏感的场景,谨慎使用通配符和模糊查询

Intervals Query为Elasticsearch提供了强大的文本位置关系查询能力,特别适合需要精确控制词项顺序和邻近度的场景。通过合理组合各种规则和过滤器,可以实现非常精细的文本匹配需求。

elasticsearch elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛美婵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值