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
						}
					}
				}
			}
		}
	}
}

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐