场景:
- 匹配邮政编码,产品序列号,或者其它以某个特定前缀开头的或者能够匹配通配符甚至正则表达式的not_analyzed值。
- 即时搜索(Search-as-you-type) - 在用户完成搜索词条的输入前就展示最有可能的结果。
- 匹配德语或者荷兰语这一类语言,它们韩哟长复合单词,比如Weltgesundheitsorganisation(World Health Organization)。
默认情况下,prefix查询不会计算相关度分值。它只是进行文档匹配,匹配的文档的分值为1。其实,相比查询它更像一个过滤器。prefix查询和prefix过滤器的唯一区别在于过滤器可以被缓存。
第一步:创建索引
假设我们将邮政编码索引为精确值的not_analyzed字段,因此我们可以创建如下索引(这一步不能少):
PUT /my_index1 { "mappings": { "address": { "properties": { "postcode": { "type": "string", "index": "not_analyzed" } } } } }
第二步:插入数据
PUT /my_index1/address/1
{ "postcode": "W1V 3DG" }
PUT /my_index1/address/2
{ "postcode": "W2F 8HW" }
PUT /my_index1/address/3
{ "postcode": "W1F 7HW" }
PUT /my_index1/address/4
{ "postcode": "WC1N 1LZ" }
PUT /my_index1/address/5
{ "postcode": "SW5 0BE" }
第三步:Prefix Query查询
查询以‘S’字母开头的postcode,注意,区分大小写
GET /my_index1/address/_search
{
"query": {
"prefix": {
"postcode": "S"
}
}
}
结果如图
在本章的稍后部分,我们会介绍一种让前缀匹配更具效率的索引期间解决方案。但是首先,让我们看看两个相关的查询:wildcard以及regexp查询。