es查询时候,我们经常会遇到这种场景:对text类型的文档进行查询或者聚合,却发现聚合的字段被es分词了。
这个时候,我们就需要对该字段设置一个keyword属性,并将该keyword属性的type设置为keyword。这样,我们在查询或者在聚合时候,通过该属性下的keyword字段,可以实现完全匹配。
示例:
对一个nested对象下的name字段设置keyword属性。
(1)创建映射。
PUT /my_store/_mapping/products?pretty
{
? "properties": {
? ? "price": {
? ? ? "type": "long"
? ? },
? ? "name": {
? ? ? "type": "text"
? ? },
? ? "owner": {
? ? ? "type": "nested",
? ? ? "properties": {
? ? ? ? "name": {
? ? ? ? ? "type": "text"
? ? ? ? },
? ? ? ? "age": {
? ? ? ? ? "type": "long"
? ? ? ? }
? ? ? }
? ? }
? }
}
(2)插入数据。
POST /my_store/products/_bulk
{ "index": { "_id": 1 }}
{ "price" : 10, "name" : "XHDK-A-1293-#fJ3","owner":{"name" :"西安","age":30}}
{ "index": { "_id": 2 }}
{ "price" : 20, "name" : "KDKE-B-9947-#kL5" ,"owner":{"name" :"西安","age":50}}
{ "index": { "_id": 3 }}
{ "price" : 30, "name" : "JODL-X-1937-#pV7","owner":{"name" :"榆林","age":20} }
{ "index": { "_id": 4 }}
{ "price" : 40, "name" : "QQPX-R-3956-#aD8","owner":{"name" :"榆林","age":10} }
(3)给nested对象下的name字段设置keyword属性。
PUT /my_s*/_mapping/products
{
"properties": {
"owner": {
"type": "nested",
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
**建议:在创建映射的时候,直接对不需要分词的字段设置keyword属性。**如下所示:
PUT /my_store/_mapping/products?pretty
{
"properties": {
"price": {
"type": "long"??
},
??"name": {???
"type": "text"??
},
?"owner": {
"type": "nested",
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}