本文共 2296 字,大约阅读时间需要 7 分钟。
在对es文档进行查询或聚合时,我们偶尔会遇到以下问题:当对text类型的文档字段进行查询或聚合时,我们发现聚合的字段被es分词了。这个时候,我们需要对该字段设置一个keyword属性,并将keyword属性的type设置为keyword类型。这样,在查询或聚合时,通过该属性下的keyword字段,就可以实现完全匹配。
我们首先需要创建一个合适的mapping。此时,我们需要在创建映射时,直接对不需要分词的字段设置keyword属性。例如,在以下mapping示例中:
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 } } }, "age": { "type": "long" } } } }}
我们为owner
字段下的name
字段设置了keyword属性。在这里,我们需要注意以下几点:
fields
属性,我们可以为该字段创建多个副本。这里,我们为name
字段新增了一个keyword
字段。keyword
类型的字段不需要分词,并且可以直接进行完全匹配。ignore_above
属性设置为256,表示在字段值超过256个字符时,会被忽略。接下来,我们需要向文档中插入数据。例如:
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 }}
在这个示例中,我们插入了四条记录。name
字段的值都是带有特定格式的字符串,包括字母、数字和一些特殊字符。
现在,我们需要修改映射,将owner
字段下的name
字段设置为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 } } }, "age": { "type": "long" } } } }}
这里,修改了owner
字段下的name
字段,使其有一个额外的keyword
字段。通过这种方式,我们可以在查询或聚合时,通过keyword
字段来实现完全匹配。
在es中对text类型字段进行查询或聚合时,如果需要实现完全匹配,可以通过为字段设置keyword
类型的方式来实现。如果你的字段不需要分词,而需要进行完全匹配,直接在创建映射时,为字段属性设置keyword
类型,并在映射中定义相应的字段副本。这样,在实际应用中,你可以通过查询或聚合时指定keyword
字段,来实现完全匹配的需求。
通过这种方式,我们可以有效地解决文档分词问题,并为需要完全匹配的字段设置合适的类型属性。
转载地址:http://xeeyk.baihongyu.com/