ElasticSearch设置字段的keyword属性

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

你可能感兴趣的:(java,elasticsearch,大数据,搜索引擎,java,开发语言)