Elasticsearch权威指南:通配符与正则表达式查询详解
理解通配符查询
通配符查询(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的数字.+
:再后跟一个或多个任意字符
性能考量与最佳实践
-
查询机制:与前缀查询类似,通配符和正则表达式查询也需要扫描倒排索引中的词项列表,逐个收集匹配的文档ID。
-
性能风险:在包含大量唯一词项的字段上运行这类查询会非常消耗资源。
-
重要建议:
- 避免以通配符开头的模式(如
*foo
或正则表达式.*foo
) - 相比前缀查询可以在索引时优化,通配符和正则表达式只能在查询时处理
- 应谨慎使用这类查询
- 避免以通配符开头的模式(如
关于已分析字段的重要注意事项
这些查询都是针对词项而非整个字段进行的。当应用于已分析(analyzed
)的字段时,它们会检查字段中的每个词项。
示例分析
假设title
字段包含"Quick brown fox",分析后会产生三个词项:quick
、brown
和fox
。
以下查询能匹配:
{ "regexp": { "title": "br.*" }}
以下查询不能匹配:
{ "regexp": { "title": "Qu.*" }} // 索引中的词项是quick而非Quick
{ "regexp": { "title": "quick br*" }} // quick和brown是分开的词项
理解这些查询的工作机制和限制,能帮助我们在Elasticsearch中更有效地实现复杂的模式匹配需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考