本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。 Elasticsearch: 权威指南 » 深入搜索 » 部分匹配 » 通配符与正则表达式查询 « prefix 前缀查询 查询时输入即搜索 »
通配符与正则表达式查询编辑
与 prefix
前缀查询的特性类似, wildcard
通配符查询也是一种底层基于词的查询,
与前缀查询不同的是它允许指定匹配的正则式。它使用标准的 shell 通配符查询: ?
匹配任意字符, *
匹配 0 或多个字符。
这个查询会匹配包含 W1F 7HW
和 W2F 8HW
的文档:
GET /my_index/address/_search { "query": { "wildcard": { "postcode": "W?F*HW" } } }
|
|
设想如果现在只想匹配 W
区域的所有邮编,前缀匹配也会包括以 WC
开头的所有邮编,与通配符匹配碰到的问题类似,如果想匹配只以 W
开始并跟随一个数字的所有邮编,
regexp
正则式查询允许写出这样更复杂的模式:
GET /my_index/address/_search { "query": { "regexp": { "postcode": "W[0-9].+" } } }
|
这个正则表达式要求词必须以 |
wildcard
和 regexp
查询的工作方式与 prefix
查询完全一样,它们也需要扫描倒排索引中的词列表才能找到所有匹配的词,然后依次获取每个词相关的文档 ID ,与 prefix
查询的唯一不同是:它们能支持更为复杂的匹配模式。
这也意味着需要同样注意前缀查询存在性能问题,对有很多唯一词的字段执行这些查询可能会消耗非常多的资源,所以要避免使用左通配这样的模式匹配(如: *foo
或 .*foo
这样的正则式)。
数据在索引时的预处理有助于提高前缀匹配的效率,而通配符和正则表达式查询只能在查询时完成,尽管这些查询有其应用场景,但使用仍需谨慎。
prefix
、 wildcard
和 regexp
查询是基于词操作的,如果用它们来查询 analyzed
字段,它们会检查字段里面的每个词,而不是将字段作为整体来处理。
比方说包含 “Quick brown fox” (快速的棕色狐狸)的 title
字段会生成词: quick
、 brown
和 fox
。
会匹配以下这个查询:
{ "regexp": { "title": "br.*" }}
但是不会匹配以下两个查询:
{ "regexp": { "title": "Qu.*" }} { "regexp": { "title": "quick br*" }}
|
在索引里的词是 |
|
|
Getting Started Videos
- Starting Elasticsearch
- Introduction to Kibana
- Logstash Starter Guide
官方地址:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_wildcard_and_regexp_queries.html