Elasticsearch权威指南:通配符与正则表达式查询详解

Elasticsearch权威指南:通配符与正则表达式查询详解

elasticsearch-definitive-guide The Definitive Guide to Elasticsearch elasticsearch-definitive-guide 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-definitive-guide

理解通配符查询

通配符查询(wildcard query)是一种基于词项的低级查询,与前缀查询类似但功能更强大。它允许我们使用标准的shell通配符模式进行匹配:

  • ? 匹配任意单个字符
  • * 匹配零个或多个字符

实际应用示例

假设我们有一个英国邮编索引,想要查找所有符合"W?F*HW"模式的邮编。这个模式可以匹配:

  • W1F 7HW(?匹配1,*匹配空格和7)
  • W2F 8HW(?匹配2,*匹配空格和8)

查询语法如下:

GET /my_index/address/_search
{
    "query": {
        "wildcard": {
            "postcode": "W?F*HW"
        }
    }
}

正则表达式查询进阶

当匹配需求更复杂时,通配符可能不够用。例如,我们想匹配所有以W开头,后跟数字的邮编(排除WC等字母开头的邮编),这时可以使用正则表达式查询(regexp query)。

正则表达式示例

GET /my_index/address/_search
{
    "query": {
        "regexp": {
            "postcode": "W[0-9].+"
        }
    }
}

这个正则表达式的含义是:

  • W:必须以W开头
  • [0-9]:后跟一个0-9的数字
  • .+:再后跟一个或多个任意字符

性能考量与最佳实践

  1. 查询机制:与前缀查询类似,通配符和正则表达式查询也需要扫描倒排索引中的词项列表,逐个收集匹配的文档ID。

  2. 性能风险:在包含大量唯一词项的字段上运行这类查询会非常消耗资源。

  3. 重要建议

    • 避免以通配符开头的模式(如*foo或正则表达式.*foo
    • 相比前缀查询可以在索引时优化,通配符和正则表达式只能在查询时处理
    • 应谨慎使用这类查询

关于已分析字段的重要注意事项

这些查询都是针对词项而非整个字段进行的。当应用于已分析(analyzed)的字段时,它们会检查字段中的每个词项。

示例分析

假设title字段包含"Quick brown fox",分析后会产生三个词项:quickbrownfox

以下查询能匹配:

{ "regexp": { "title": "br.*" }}

以下查询不能匹配:

{ "regexp": { "title": "Qu.*" }}  // 索引中的词项是quick而非Quick
{ "regexp": { "title": "quick br*" }}  // quick和brown是分开的词项

理解这些查询的工作机制和限制,能帮助我们在Elasticsearch中更有效地实现复杂的模式匹配需求。

elasticsearch-definitive-guide The Definitive Guide to Elasticsearch elasticsearch-definitive-guide 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-definitive-guide

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

缪阔孝Ruler

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

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

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

打赏作者

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

抵扣说明:

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

余额充值