本文介绍 Wildcard Type 的基本使用方法。
Wildcard 类型作为 Keyword 类型的变体,主要用于提高原本应用在 Keyword 字段上的 regex/wildcard 查询性能。在索引阶段,Keyword 字段的数据会作为一个整体被索引,而 Wildcard 则会以 ngram 的方式进行索引(默认 N 为 3)。即 ABCD 将会以 ABC 和 BCD 被索引(目前的实现也会有长度为 1/2 的子串被索引),处理查询时也会采用类似的方法,如 test
查询将被作为 tes AND est
被查询,先进行初步的筛选,再进行最终的匹配。
说明
在 Wildcard 类型上进行完全匹配的查询(term/terms)性能将会弱于 Keyword 类型,您需要根据实际的查询方式来决定是否要使用 Wildcard Type。
该功能在 ES 7.10.2 和 OpenSearch 2.9 版本上默认支持。
*
开头的查询。相比于使用 Keyword,空间占用会变大。
创建包含 Wildcard 字段类型的索引。
PUT logs { "mappings" : { "properties" : { "log_line" : { "type" : "wildcard" } } } }
在 Wildcard 字段上进行 Wildcard 类型查询。
GET logs/_search { "query": { "wildcard": { "log_line": { "value": "k*y*fi*", "case_insensitive":"true", "boost":"2" } } } }
其中:
case_insensitive
:可选,表示匹配时,是否大小写敏感,默认敏感。boost
:可选,修改查询得分权重。value
支持 2 种特殊通配符:
*
:代表长度大于 0 的任何字符串。?
:代表长度为 1 的任何字符。关于 Wildcard 的更多信息,可参考 Wildcard field type 和 Wildcard query。