博客
关于我
ElasticSearch设置字段的keyword属性
阅读量:785 次
发布时间:2023-01-24

本文共 2296 字,大约阅读时间需要 7 分钟。

在对es文档进行查询或聚合时,我们偶尔会遇到以下问题:当对text类型的文档字段进行查询或聚合时,我们发现聚合的字段被es分词了。这个时候,我们需要对该字段设置一个keyword属性,并将keyword属性的type设置为keyword类型。这样,在查询或聚合时,通过该属性下的keyword字段,就可以实现完全匹配。

示例:对嵌套对象下的name字段设置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字段的值都是带有特定格式的字符串,包括字母、数字和一些特殊字符。

步骤三:为嵌套对象下的name字段设置keyword属性

现在,我们需要修改映射,将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/

你可能感兴趣的文章
java 反义_java中一些常用的英语
查看>>
java 命令行 class_如何从命令行执行java .class
查看>>
java 字符编码过滤器_java web中字符编码的过滤器(Filter - 1)
查看>>
java 线程 栈_Java线程堆栈分析
查看>>
#NOIP前数学知识总结
查看>>
java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!
查看>>
java序列化_java对象的序列化和反序列化
查看>>
java开发区块链_用Java代码实现区块链
查看>>
java快捷键eclipse_eclipse的设置和一些快捷键
查看>>
java拼车平台(ssm框架毕业设计)
查看>>
Java指定区间返回随机数
查看>>
Java推动老年人社区服务(毕设源码+mysql+lw)
查看>>
Java提高班(六)反射和动态代理(JDK Proxy和Cglib)
查看>>
java操作List
查看>>
Java操作Sql语句 出现迭代死循环 (Bug排查)
查看>>
#Leetcode# 92. Reverse Linked List II
查看>>
# tail -f /var/log/zabbix/zabbix_agentd.log sudo: sorry, you must have a tty to run sudo
查看>>
java攀枝花市房屋租售信息管理平台的设计与实现(ssm)
查看>>
java教学团队管理系统(ssm)
查看>>
java教学网站(ssm)
查看>>