Elasticsearch:constant keyword 数据类型
Posted Elastic 中国社区官方博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch:constant keyword 数据类型相关的知识,希望对你有一定的参考价值。
Constant keyword 是 keyword 字段的特例,用于索引中所有文档具有相同值的情况。比如,
PUT logs-debug
{
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"message": {
"type": "text"
},
"level": {
"type": "constant_keyword",
"value": "debug"
}
}
}
}
constant_keyword 支持与 keyword 字段相同的查询和聚合,但利用所有文档每个索引具有相同值的事实来更有效地执行查询。
允许提交没有字段值或值等于映射中配置的值的文档。 以下两个索引请求是等效的:
POST logs-debug/_doc
{
"date": "2019-12-12",
"message": "Starting up Elasticsearch",
"level": "debug"
}
POST logs-debug/_doc
{
"date": "2019-12-12",
"message": "Starting up Elasticsearch"
}
如果我们进行如下的查询:
GET logs-debug/_search
{
"query": {
"match": {
"level": "debug"
}
}
}
上面查询显示的结果是:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "logs-debug",
"_type" : "_doc",
"_id" : "5-kGLnsBpDPgC7Zlr6gp",
"_score" : 1.0,
"_source" : {
"date" : "2019-12-12",
"message" : "Starting up Elasticsearch",
"level" : "debug"
}
},
{
"_index" : "logs-debug",
"_type" : "_doc",
"_id" : "6OkGLnsBpDPgC7Zlt6gM",
"_score" : 1.0,
"_source" : {
"date" : "2019-12-12",
"message" : "Starting up Elasticsearch"
}
}
]
}
}
从上面,我们可以看到尽管第二个文档里没有明显的字段 level,但是它还是被搜索出来了。
如果我们在写入文档时填写和 mapping 中定义不一样的值时,它就会报错,比如:
POST logs-debug/_doc
{
"date": "2019-12-12",
"message": "Starting up Elasticsearch",
"level": "info"
}
在上面的 level 中,我们给它不同的值 info 而不是 debug,那么我们可以看到如下的错误信息:
{
"error" : {
"root_cause" : [
{
"type" : "mapper_parsing_exception",
"reason" : "failed to parse field [level] of type [constant_keyword] in document with id '6ekZLnsBpDPgC7ZlSKhU'. Preview of field's value: 'info'"
}
],
"type" : "mapper_parsing_exception",
"reason" : "failed to parse field [level] of type [constant_keyword] in document with id '6ekZLnsBpDPgC7ZlSKhU'. Preview of field's value: 'info'",
"caused_by" : {
"type" : "illegal_argument_exception",
"reason" : "[constant_keyword] field [level] only accepts values that are equal to the value defined in the mappings [debug], but got [info]"
}
},
"status" : 400
}
如果没有值在映射设置,该字段将基于包含在所述第一索引文档中的值自动进行配置。虽然这种行为可以方便,请注意,这意味着一个有毒文件可能会导致拒绝所有其他文件,如果它有一个错误的值。比如:
PUT logs-info
{
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"message": {
"type": "text"
},
"level": {
"type": "constant_keyword"
}
}
}
}
在上面,我们定义了 level 的类型,但是我们没有定义它的值,那么当我们使用如下的方法写入两个文件时:
POST logs-info/_doc
{
"date": "2019-12-12",
"message": "Starting up Elasticsearch",
"level": "info"
}
POST logs-info/_doc
{
"date": "2019-12-12",
"message": "Starting up Elasticsearch"
}
因为第一个文档里定义的 level 的值为 info,那么之后所有的文档将视 info 为索引 logs-info 字段 level 的默认值。我们可以做如下的查询:
GET logs-info/_search
{
"query": {
"match": {
"level": "info"
}
}
}
我们可以同时查询到上面的两个文档。
在没有提供任何的值之前(或者通过映射或文档),查询的字段将不会匹配任何文件。这包括 exists 查询。
一旦这个字段的值被确定后,之后就不可以更改。
很多人想,这个字段到底有啥用途呢?就像之前提到的针对 constant_keyword 字段的查询非常高效。这种情况适用于我们做如下的查询:
GET logs-*/_search
{
"query": {
"match": {
"level": "info"
}
}
}
在我们已经创建 logs-debug 及 logs-info 的索引的情况下。
constant_keyword 字段被广泛使用于 Elastic datastream 的命名方案中。
以上是关于Elasticsearch:constant keyword 数据类型的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch:constant keyword 数据类型
Elasticsearch Query DSL备忘(Constant score query和Bool Query)