跳到主要内容

Elasticsearch 通配符查询

Elasticsearch是一个强大的搜索引擎,支持多种查询方式。其中,通配符查询(Wildcard Query)是一种非常灵活的查询方式,允许你使用通配符来匹配文档中的字段值。本文将详细介绍通配符查询的概念、语法以及实际应用场景。

什么是通配符查询?

通配符查询允许你在搜索时使用通配符来匹配文档中的字段值。Elasticsearch支持两种通配符:

  • *:匹配零个或多个字符。
  • ?:匹配单个字符。

通过组合这些通配符,你可以构建复杂的搜索模式,从而找到与特定模式匹配的文档。

通配符查询的基本语法

通配符查询的基本语法如下:

json
{
"query": {
"wildcard": {
"field_name": {
"value": "search_pattern"
}
}
}
}
  • field_name:你要搜索的字段名称。
  • search_pattern:包含通配符的搜索模式。

示例1:使用 * 通配符

假设我们有一个包含用户信息的索引,字段 username 存储了用户的用户名。我们想要查找所有以 john 开头的用户名,可以使用以下查询:

json
{
"query": {
"wildcard": {
"username": {
"value": "john*"
}
}
}
}

输入:

json
{
"query": {
"wildcard": {
"username": {
"value": "john*"
}
}
}
}

输出:

json
{
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"hits": [
{
"_source": {
"username": "john_doe"
}
},
{
"_source": {
"username": "john_smith"
}
}
]
}
}

示例2:使用 ? 通配符

假设我们想要查找所有用户名为 joh? 格式的用户,其中 ? 代表任意单个字符。可以使用以下查询:

json
{
"query": {
"wildcard": {
"username": {
"value": "joh?"
}
}
}
}

输入:

json
{
"query": {
"wildcard": {
"username": {
"value": "joh?"
}
}
}
}

输出:

json
{
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"hits": [
{
"_source": {
"username": "john"
}
}
]
}
}
备注

通配符查询对性能有一定的影响,尤其是在搜索模式的开头使用通配符时(例如 *john)。为了提高查询性能,建议尽量避免在搜索模式的开头使用通配符。

实际应用场景

场景1:模糊搜索

假设你正在开发一个电商网站,用户可以通过输入部分商品名称来搜索商品。例如,用户输入 app*,你希望返回所有以 app 开头的商品名称,如 apple, apparel, appliance 等。

json
{
"query": {
"wildcard": {
"product_name": {
"value": "app*"
}
}
}
}

场景2:匹配特定格式的字段

假设你有一个包含电话号码的索引,电话号码的格式为 +1-XXX-XXX-XXXX。你想要查找所有以 +1-555 开头的电话号码,可以使用以下查询:

json
{
"query": {
"wildcard": {
"phone_number": {
"value": "+1-555*"
}
}
}
}

总结

通配符查询是Elasticsearch中一种非常灵活的查询方式,适用于需要模糊匹配的场景。通过使用 *? 通配符,你可以构建复杂的搜索模式,从而找到与特定模式匹配的文档。然而,通配符查询对性能有一定的影响,尤其是在搜索模式的开头使用通配符时,因此在实际应用中需要谨慎使用。

附加资源与练习

  • 练习1:尝试在你的Elasticsearch索引中使用通配符查询,查找所有以 test 开头的文档。
  • 练习2:使用 ? 通配符查找所有长度为5个字符的用户名。
提示

如果你对Elasticsearch的其他查询方式感兴趣,可以继续学习 正则表达式查询模糊查询,它们在某些场景下可以替代通配符查询。