IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Elasticsearch:constant keyword 数据类型 -> 正文阅读

[大数据]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 的命名方案中。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:28:56  更:2021-08-11 12:29:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 19:24:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码