elasticsearch-wildcard、regexp通配符与正则表达式查询

本文介绍如何使用通配符和正则表达式查询邮编。通过示例展示了wildcard查询和regexp正则式查询的用法,前者使用标准的shell通配符,后者允许指定更复杂的模式,同时提醒了性能问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通配符与正则表达式查询

假设将邮编作为 not_analyzed 的精确值字段索引,所以可以为其创建索引,如下:

PUT /my_index
{
    "mappings": {
        "address": {
            "properties": {
                "postcode": {
                    "type":  "string",
                    "index": "not_analyzed"
                }
            }
        }
    }
}

与 prefix 前缀查询的特性类似, wildcard 通配符查询也是一种底层基于词的查询,与前缀查询不同的是它允许指定匹配的正则式。它使用标准的 shell 通配符查询: ? 匹配任意字符, * 匹配 0 或多个字符。

这个查询会匹配包含 W1F 7HW 和 W2F 8HW 的文档:

GET /my_index/address/_search
{
    "query": {
        "wildcard": {
            "postcode": "W?F*HW" (1)
        }
    }
}
  1. ? 匹配 1 和 2 , * 与空格及 7 和 8 匹配。

设想如果现在只想匹配 W 区域的所有邮编,前缀匹配也会包括以 WC 开头的所有邮编,与通配符匹配碰到的问题类似,如果想匹配只以 W 开始并跟随一个数字的所有邮编, regexp 正则式查询允许写出这样更复杂的模式:

GET /my_index/address/_search
{
    "query": {
        "regexp": {
            "postcode": "W[0-9].+" (1)
        }
    }
}
  1. 这个正则表达式要求词必须以 W 开头,紧跟 0 至 9 之间的任何一个数字,然后接一或多个其他字符。

这也意味着需要同样注意前缀查询存在性能问题,对有很多唯一词的字段执行这些查询可能会消耗非常多的资源,所以要避免使用左通配这样的模式匹配(如: *foo 或 .*foo 这样的正则式)。

转载于:https://blog.youkuaiyun.com/chuan442616909/article/details/57910101

### Elasticsearch通配符正则表达式和模糊查询的用法及区别 #### 通配符查询Wildcard Query) 通配符查询允许使用 `*` 和 `?` 来表示多个字符或单个字符。这种类型的查询适用于精确匹配模式下的字符串搜索。 - `*` 表示零个或多个任意字符。 - `?` 表示恰好一个任意字符。 需要注意的是,通配符查询可能会非常耗费资源,尤其是在索引较大的情况下。因此,在实际应用中应当谨慎使用[^1]。 ```json { "query": { "wildcard": { "title": "*hello?" } } } ``` #### 正则表达式查询Regexp Query) 正则表达式查询支持更复杂的模式匹配功能,可以定义更加灵活的条件来查找文档中的特定字段值。它提供了强大的文本处理能力,但是性能通常不如其他类型的查询高效。 常见的元字符包括但不限于: - `.` 匹配任何单一字符; - `.*` 匹配0到多任意字符序列; - `[abc]` 匹配方括号内的任一字符; 语法上遵循POSIX标准。 ```json { "query": { "regexp": { "content": "[s|S]earch.*" } } } ``` #### 模糊查询(Fuzzy Query) 模糊查询用于当输入可能存在拼写错误时找到相似的结果。通过设置编辑距离参数控制近似程度,默认最大编辑距离为2。此特性对于提高用户体验特别有用,因为它能够容忍一定程度上的误打字等问题。 ```json { "query": { "fuzzy": { "name": { "value": "Jonh", "fuzziness": 2, "prefix_length": 0, "max_expansions": 50 } } } } ``` 每种方式都有其适用场景以及局限性,选择合适的查询方法取决于具体需求数据特点。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值