【Elasticsearch教程12】Mapping字段类型之object

这篇具有很好参考价值的文章主要介绍了【Elasticsearch教程12】Mapping字段类型之object。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


首先给出结论:
  • 在一个字段存储一个JSON对象,可以选择object类型
  • 在一个字段存储多个JSON对象,可以选择nested类型

一、传统数据库存object

假设有一个人员信息如下:

{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": { 
      "first": "John",
      "last":  "Smith"
    }
  }
}

建表时会建一个字段存一个值,它的缺点是字段扁平化, 无法直观的表现层级关系

字段
region US
manager_age 30
manager_firstname John
manager_lastname Smith

二、ES存object

ES中,一个字段存的就是一个JSON,JSON格式本身就包含嵌套的层级关系。

2.1 创建mapping

  • 一层有2个字段:regionmanager
  • manager包含2个字段: agename
  • name包含2个字段:firstlast
PUT pigg_test_object
{
  "mappings": {
    "properties": {
      "region": {
        "type": "keyword"
      },
      "manager": {
        "properties": {
          "age": {
            "type": "integer"
          },
          "name": {
            "properties": {
              "first": {
                "type": "keyword"
              },
              "last": {
                "type": "keyword"
              }
            }
          }
        }
      }
    }
  }
}

2.2 插入数据

PUT pigg_test_object/_doc/1
{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": { 
      "first": "John",
      "last":  "Smith"
    }
  }
}

在ES内部,这些值其实是按如下格式存储的

{
  "region":             "US",
  "manager.age":        30,
  "manager.name.first": "John",
  "manager.name.last":  "Smith"
}

2.3 查询object数据

查询子字段时,得输入字段的全名,如manager.name.first

GET /pigg_test_object/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "manager.name.first": {
              "value": "John"
            }
          }
        }
      ]
    }
  }
}

三、object不要存数组

3.1 存入object数组

  • 30岁的John Smith
  • 40岁的Geen Hank
PUT pigg_test_object/_doc/1
{
    "region":"US",
    "manager":[
        {
            "age":30,
            "name":{
                "first":"John",
                "last":"Smith"
            }
        },
        {
            "age":40,
            "name":{
                "first":"Geen",
                "last":"Hank"
            }
        }
    ]
}

3.2 验证错误的查询结果

查询30岁的Geen按照正常理解,是不应该查询出来结果的,但是它能返回数据

GET /pigg_test_object/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "manager.age": {
              "value": "30"
            }
          }
        },
        {
          "term": {
            "manager.name.first": {
              "value": "Geen"
            }
          }
        }
      ]
    }
  }
}

这是因为在ES内部,数据会如下格式存储

{
  "region":             "US",
  "manager.age":        [30, 40],
  "manager.name.first": ["John", "Geen"],
  "manager.name.last":  ["Smith", "Hank"]
}

这样的存储方式没有把2个人信息分开存储,而是混合在一起,所以有了文章开头的结论:

  • 在一个字段存储一个JSON对象,可以选择object类型
  • 在一个字段存储多个JSON对象,可以选择nested类型

四、object的参数enabled

  • enabled参数只用于object类型,默认值是true(开启)
  • 为true时,ES会object里的所有字段进行索引操作, 这样就可以根据该字段检索文档
  • 为false时,ES不去解析object里的字段,不会索引每个字段
  • 当只需要返回该字段用于展示,而不需要索引某个字段时(例如session信息,我们很少用session作为查询条件),可设置enabled=false

实验如下:

PUT pigg_test_enabled
{
  "mappings": {
    "properties": {
      "name": {"enabled": false}
    }
  }
}

插入多种格式的值

PUT pigg_test_enabled/_doc/1
{
  "name": "winter"
}

PUT pigg_test_enabled/_doc/2
{
  "name": {
    "first_name": "wang",
    "last_name": "dong"
  }
}

GET pigg_test_enabled/_search

返回发现: 不同的值都可以存入
 "hits" : [
      {
        "_index" : "pigg_test_enabled",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "winter"
        }
      },
      {
        "_index" : "pigg_test_enabled",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "name" : {
            "first_name" : "wang",
            "last_name" : "dong"
          }
        }
      }
    ]

查看mapping

GET pigg_test_enabled/_mapping

返回如下: name类型是object, 并不会解析name在其下面添加first_name和last_name子字段
{
  "pigg_test_enabled" : {
    "mappings" : {
      "properties" : {
        "name" : {
          "type" : "object",
          "enabled" : false
        }
      }
    }
  }
}

在enable=false的字段上检索文档, 是查询不到数据的

GET pigg_test_enabled/_search
{
  "query": {
    "term": {
      "name": {
        "value": "winter"
      }
    }
  }
}

返回没有数据

下一篇博客会详细讲解nested类型,如果本文对您有帮助,就给亚瑟王点个赞👍吧。文章来源地址https://www.toymoban.com/news/detail-709449.html

到了这里,关于【Elasticsearch教程12】Mapping字段类型之object的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch Mapping字段未支持索引导致搜索失效

    生产上Es根据一个时间字段搜索,却没有返回数据 根据命令: GET indexName/_mapping 查看 count_name设置了 “index”: false 导致根据该字段搜索导致索引不生效。 ES的mappings 定义好了生成索引后是不支持修改现有的字段的,只能新增属性。 使用 reindex 命令处理 1、运行命令: GET ind

    2024年02月11日
    浏览(26)
  • ElasticSearch数据库修改分片数、副本数及修改mapping字段

            对于已经存在的索引,副本数可以随时修改。 示例演示如下:         ElasticSearch中的数据会被分别存储在不同的分片上,索引库的分片数量是在索引库创建的时候通过settings去设置的,如果不设置,分片数默认是5,分片数一旦确定就不能改变。分片数量的设

    2024年02月02日
    浏览(41)
  • es elasticsearch 八 mapping 映射 、复杂数据类型

    目录 Mapping 映射 复杂数据类型 Mapping 映射 精确匹配 必须和对应字段值安全一致才可查出 全文检索 缩写搜索全程、格式转换 大小写 同义词 全文检索核心原理 分词,初步的倒排索引的建立 重建倒排索引 时态转换、重复数的转换、同义词的转换、大小写的转换 分词器 analy

    2024年02月07日
    浏览(46)
  • ElasticSearch修改索引字段类型

    线上功能报错,一看日志是往es中添加数据报错,错误日志如下: 说是数据中有个字段类型转换错误,一查es脚本工具,果然生产es索引中categoryId这个字段是integer类型,而实际是long类型。 es不能直接修改索引字段类型,需要删除调新建,具体方法如下 我这次遇到问题的es索引

    2023年04月08日
    浏览(32)
  • Elasticsearch映射与字段类型

    Elasticsearch映射与字段类型 Elasticsearch是一个分布式、实时的搜索和分析引擎,基于Lucene库构建。它可以快速、高效地索引、搜索和分析大量数据。在Elasticsearch中,数据以文档的形式存储,每个文档都有一个唯一的ID。文档可以存储在一个索引中,索引可以存储在一个集群中。

    2024年02月22日
    浏览(55)
  • 7.elasticsearch字段类型列表

    1.本文总结自  Field datatypes | Elasticsearch Guide [7.2] | Elastic 2.本文罗列了 elasticsearch常用的字段类型; 3.es字段类型总结(https://www.elastic.co/guide/en/elasticsearch/reference/7.2/mapping-types.html): 1)核心数据类型: string字符串: text:文本类型(分词); keyword:类型(不分词);

    2024年02月02日
    浏览(36)
  • elasticsearch 其他字段类型详解和范例

    elasticsearch 中 别名字段 的详解和范例 elasticsearch 中 二进制类型 的详解和范例 elasticsearch 中的 嵌套类型 的详解和范例 elasticsearch 中的 范围类型 的详解和范例 elasticsearch 中的 排名类型 的详解和范例 elasticsearch 中的 ip类型 的详解和范例 elasticsearch 中的 search-as-you-type 类型 的详

    2024年02月02日
    浏览(30)
  • Elasticsearch中object类型与nested类型以及数组之间的区别

    0、一般情况下用object 类型来查es中为json对象的字段数据,用nested来查es中为JsonArray数组类型的字段数据。 1、默认情况下ES会把JSON对象直接映射为object类型,只有手动设置才会映射为nested类型 2、object类型可以直接使用普通的逗号(.)查询,比如 3、nested类型的查询需要使用

    2024年01月22日
    浏览(56)
  • Elasticsearch给索引添加新字段并赋值(API方式)

    结果: 当前的user索引具有name、age、sex三个字段 给索引user添加class字段 添加完成后再次查看索引结构: 结果: 可以看到结构中已经有了class字段了 结果: 因为class字段在没有数据,所以自动过滤掉了不显示; 用法1 再次查看索引user数据,结果: 可以看到现在的class字段数

    2024年02月11日
    浏览(26)
  • Elasticsearch 索引管理:使用别名来修改字段类型

    在 Elasticsearch 中,一个常见的问题是如何修改已存在的索引的字段类型。这是一个棘手的问题,因为 Elasticsearch 本身不允许直接修改字段类型。如果删除现有索引,重新建索引的话则会导致数据丢失。有一个方法是使用别名索引,当需要调整索引时可以先新建一个索引,把数

    2024年02月03日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包