7.elasticsearch字段类型列表

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

【README】

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:关键字类型(不分词);
    • numeric-数值类型:
      • long, integer, short, byte, double, float, half_float, scaled_float  
    • date-日期类型(存储自unix纪元以来的毫秒数);
    • date_nanos:日期纳秒类型(存储自unix纪元以来的纳秒数);
    • boolean-布尔类型;
    • binary-二进制类型;
    • range-范围类型:    
      • integer_range, float_range, long_range, double_range, date_range
  • 2)复杂数据类型
    • object:对象类型;存储单个json对象;
    • nested:嵌套类型;存储json对象数组;    
  • 3)数组类型(字段数组类型)
    • 数组不需要专用的数据类型。一个字段默认可以包含0个或多个值。然而,数组中的所有值必须是同一种类型;
  • 4)多字段类型:
    • 根据不同目的以不同方式索引同一字段是有帮助的;
    • 举例,字符串字段可以被映射为 text字段以便全文搜索,也可以映射为keword以便于排序或聚合。
  • 5)其他数据类型
    • 如地理位置信息数据类型,ip数据类型等(没有罗列完全);

【1】核心数据类型

【1.1】string字符串(分词)

1)text类型:文本类型(分词)

  • 用于定义索引全文值的字段,如电子邮件或产品描述。
  • 这些字段会被分析,即在索引前,这些字段会通过一个分析器把字符串转换为单个单词的列表。该分析过程允许es在每个全文字段中搜索单个词汇。Text字段(文本字段)不用于排序与聚合
  • 如果你需要索引结构化内容,如邮件地址,域名,邮编等,也许你应该使用keyword字段类型;
  • 补充; text字段参数列表参见; https://www.elastic.co/guide/en/elasticsearch/reference/7.2/text.html

2)keyword:关键字类型(不分词)

  • 用于定义索引结构化内容的字段,如邮件地址,域名,邮编等。
  • 它们通常用于过滤(查找我所有被发表过的博客帖子),排序,聚合。Keyword字段只能通过他们的精确值被搜索到。
  • 补充;keyword字段参数列表参见;https://www.elastic.co/guide/en/elasticsearch/reference/7.2/keyword.html

【1.2】Numeric-数值类型

数值类型的子类型列表:

  • long, integer, short, byte, double, float, half_float, scaled_float 
  • scaled_float 是缩放参数,即 99.99 可以放大100倍进行存储,好处有二:
    • 1,可以节省磁盘空间;
    • 2, 可以提高检索效率;

es 字段类型,(-2)elasticsearch,elasticsearch,大数据,搜索引擎

// 建立索引映射,带有 数值类型
PUT my_index
{
  "mappings": {
    "properties": {
      "number_of_bytes": {
        "type": "integer"
      },
      "time_in_seconds": {
        "type": "float"
      },
      "price": {
        "type": "scaled_float",
        "scaling_factor": 100
      }
    }
  }
}

 【1.3】date日期类型

1)Json并没有日期数据类型,因此es中的date字段表示为以下几种形式之一

  • ① 字符串类型:包含格式化日期,如 “2015-01-01”或 “2015/01/01 12:10:13”;
  • ② 长整型数字:表示自unix纪元以来的毫秒数;
  • ③ 整型数字:表示自unix纪元以来的秒数;

补充:unix纪元是 1970-01-01 00:00:00
2)在es内部,日期被转为世界标准时间UTC(若指定时区)并存储为长整型表示自纪元以来的毫秒数;
3)对日期的查询:

  • 在es内部,被转为对长整型数字的范围查询,聚合结果和存储的字段根据关联的日期格式被反转为字符串;

4)日期通常表示为字符串,即便在json文档中以long类型提供;
5)日期格式能够自定义,但若没有指定格式,则默认为如下格式:

  • "strict_date_optional_time||epoch_millis"

这意味着该字段可以接收可选的时间戳日期,这些时间戳符合 strict_date_optional_time 或 milliseconds-since-the-epoch 支持的格式。

6)多个日期格式:

  • 多个日期格式通过||分割符通过分割来指定。每个格式将被循环尝试直到发现匹配格式。第一个格式将被用于把自纪元以来的毫秒数值反转为字符串;
PUT my_index
{
  "mappings": {
    "properties": {
      "date": {
        "type":   "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}

【1.4】date_nanos (日期带纳秒类型  )

1)该数据类型是对date类型的补充。 然而,两者有着很大不同。

  • date类型使用毫秒分辨率存储日期字段值;
  • 而 date_nanos 使用纳秒,这限制了 date_nanos的日期表示范围是 1970到2262年,因为日期字段值被存储为长整型表示自纪元以来的纳秒。

2)date_nanos的其他属性同 date类型。如

PUT my_index?include_type_name=true
{
  "mappings": {
    "_doc": {
      "properties": {
        "date": {
          "type": "date_nanos" 
        }
      }
    }
  }
}

【1.5】boolean-布尔类型

1)boolean 接收json的true 和 false值,也接收能够解释为 true或false 的字符串。

  • false值: false,”false”, “”
  • true值: true , “true”

2)例子:

PUT my_index
{
  "mappings": {
    "properties": {
      "is_published": {
        "type": "boolean"
      }
    }
  }
}

【1.6】binary-二进制类型

1)二进制类型接收二进制值作为base64编码的字符串。该类型字段默认不存储且不能被搜索。

// 创建索引 
PUT my_index
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "blob": {
        "type": "binary"
      }
    }
  }
}

// 新增文档 
PUT my_index/_doc/1
{
  "name": "Some binary blob",
  "blob": "U29tZSBiaW5hcnkgYmxvYg==" 
}

【1.7】范围类型 (不常用)

1)范围子类型有:

  • integer_range, float_range, long_range, double_range, date_range
// 创建索引 
PUT range_index
{
  "settings": {
    "number_of_shards": 2
  },
  "mappings": {
    "properties": {
      "expected_attendees": {
        "type": "integer_range"
      },
      "time_frame": {
        "type": "date_range", 
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      }
    }
  }
}
// 新增文档 
PUT range_index/_doc/1?refresh
{
  "expected_attendees" : { 
    "gte" : 10,
    "lte" : 20
  },
  "time_frame" : { 
    "gte" : "2015-10-31 12:00:00", 
    "lte" : "2015-11-01"
  }
}

【2】复杂数据类型

【2.1】object-对象类型

1)对象类型:针对单个json文档 ;

  • Json对象类型本质上是分层的。文档可能包含内部对象,而内部对象还可以包含内部对象(理论上无限嵌套,但嵌套层数越多,解析成本越高,性能越低)。

2)es文档类型

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

// 内部地,这个文档被索引为简单的,扁平的kv键值对列表,如下:
{
  "region":             "US",
  "manager.age":        30,
  "manager.name.first": "John",
  "manager.name.last":  "Smith"
}
// es映射定义如下:
PUT my_index
{
  "mappings": {
    "properties": { 
      "region": {
        "type": "keyword"
      },
      "manager": { 
        "properties": {
          "age":  { "type": "integer" },
          "name": { 
            "properties": {
              "first": { "type": "text" },
              "last":  { "type": "text" }
            }
          }
        }
      }
    }
  }
} 

【2.2】nested嵌套类型(用于存储json对象数组)

1)嵌套类型:针对 json文档数组 ;
2)这种 nested 嵌套类型是object 类型的特别版本,它允许对象数组被索引,通过这种方式使得数组元素可以被独立搜索;
3)数组对象如何被扁平化

  • object类型字段的数组无法如你期望的方式工作。Lucene没有内部object的概念,因此es把对象层级扁平化为简单的字段名和值列表

【2.2.1】es对对象层级的扁平化处理(es用对象类型存储对象数组带来的问题

PUT my_index/_doc/1
{
  "group" : "fans",
  "user" : [ 
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}
// user 字段被es默认设置为object类型

在es内部,该json对象会被转换为如下文档。

{
  "group" :        "fans",
  "user.first" : [ "alice", "john" ],
  "user.last" :  [ "smith", "white" ]
}

使用es对象类型存储对象数组带来的问题

  • User.first 和 user.last 字段展平为多值字段,而 alice和white的关联丢失了。这会导致文档错误匹配上  user.first = alice 且 user.last = smith
  • 即 对象{first:John, last:Smith} 与 对象 {first:Alice, last: White} 之间的对象边界没有了;这显然不符合我们的预期;

【2.2.2】es存储json数组的解决方案:使用 nested嵌套类型存储对象数组

1)如果你需要索引对象数组且保持数组中每个对象的独立性,你应该使用 nested嵌套数据类型,而不是object对象类型

2)在es内部,嵌套类型把数组中的每个对象索引为单个隐藏文档,这意味着每一个嵌套对象能够独立于其他嵌套对象被搜索。

3)嵌套搜索dsl如下:

// 创建索引 (带有嵌套数据类型-nested)
PUT my_index
{
  "mappings": {
    "properties": {
      "user": {
        "type": "nested" 
      }
    }
  }
}
// 新增文档 (以数组形式新增文档到嵌套类型)
PUT my_index/_doc/1 
{
  "group" : "fans",
  "user" : [
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}
// 搜索文档 (嵌套查询dsl)
GET my_index/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must": [
            { "match": { "user.first": "Alice" }},
            { "match": { "user.last":  "Smith" }} 
          ]
        }
      }
    }
  }
} 

4)nested-嵌套文档能够进行如下操作:

  • 嵌套搜索(nested query);
  • 使用嵌套分词和逆嵌套聚合(逆嵌套-reverse_nested);
  • 嵌套排序(nested sorting);
  • 根据嵌套内部命中实现检索和高亮(nested inner hits);

5)对nested嵌套映射和对象的限制设置
如以上描述所说,每一个嵌套文档会被索引为独立文档

  • 如果我们索引包含100个user对象的的单个文档,实际上产生了101个文档。因为user是嵌套字段,100个user每个user各自一个文档,父文档也要单独创建一个文档。

因为涉及到nested嵌套映射的成本,es需要做一些设置以防出现性能问题

  • ① index.mapping.nested_fields.limit
    • 嵌套类型应该只被在特殊场景下使用,当数组对象需要被独立搜索时。为防止设置出不佳的映射,此设置(index.mapping.nested_fields.limit)限制了每个索引的嵌套字段数量。
    • es默认每个索引最多可以包含50个嵌套字段
  • ② index.mapping.nested_objects.limit:
    • 此设置(index.mapping.nested_objects.limit)限制了单个文档包含的嵌套对象的数量,以防止一个文档包含过多嵌套对象时报内存溢出错误。
    • Es默认情况下,一个文档包含的嵌套文档数量最多是10000个

【3】数组类型(字段数组类型)

在es中, 数组不需要专用的数据类型

  • 一个字段默认可以包含0个或多个值。然而,数组中的所有值必须是同一种类型

【4】多字段类型

1)根据不同目的以不同方式索引同一字段是有帮助的;

  • 举例,字符串字段可以被映射为 text字段以便全文搜索,也可以同时映射为keword以便于排序或聚合。

2)此外,你还可以用标准分词器,英文分词器或法语分词器来索引text字段;
3)通过 fields 参数来指定同一个字段的多种数据类型。

  • 参见: https://www.elastic.co/guide/en/elasticsearch/reference/7.2/multi-fields.html
  • // 字符串字段可以被映射为 text字段以便全文搜索
    // 也可以同时映射为keword以便于排序或聚合
    PUT my_index
    {
      "mappings": {
        "properties": {
          "city": {
            "type": "text",
            "fields": {
              "raw": { 
                "type":  "keyword"
              }
            }
          }
        }
      }
    }

【5】其他数据类型

如 地理位置信息数据类型,ip数据类型等。
详情参见:  https://www.elastic.co/guide/en/elasticsearch/reference/7.2/mapping-types.html文章来源地址https://www.toymoban.com/news/detail-784024.html

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

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

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

相关文章

  • 使用Logstash同步mysql数据到Elasticsearch(亲自踩坑)_将mysql中的数据导入es搜索引擎利用logstash(1)

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新大数据全套学习资料》,

    2024年04月28日
    浏览(52)
  • ElasticSearch系列 - SpringBoot整合ES:映射中定义字段的数据类型及属性

    ElasticSearch - SpringBoot整合ES:映射定义字段的数据类型及属性 01. ElasticSearch 搜索结果的准确性和召回率是什么? 在Elasticsearch中,搜索结果的准确性和召回率是非常重要的指标,它们反映了搜索引擎的性能和效果。以下是这两个指标的定义和解释: 准确性:搜索结果的准确性

    2024年02月08日
    浏览(47)
  • ElasticSearch内容分享(四):ES搜索引擎

    目录 ES搜索引擎 1. DSL设置查询条件 1.1 DSL查询分类 1.2 全文检索查询 1.2.1 使用场景 1.2.2 match查询 1.2.3 mulit_match查询 1.3 精准查询 1.3.1 term查询 1.3.2 range查询 1.4 地理坐标查询 1.4.1 矩形范围查询 1.4.2 附近(圆形)查询 1.5 复合查询 1.5.0 复合查询归纳 1.5.1 相关性算分 1.5.2 算分函数查

    2024年02月05日
    浏览(51)
  • 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日
    浏览(41)
  • 搜索引擎ElasticSearch分布式搜索和分析引擎学习,SpringBoot整合ES个人心得

    Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,

    2024年02月04日
    浏览(72)
  • 入门ElasticSearch :为什么选择ES作为搜索引擎?

    随着数据量的不断增长,搜索和分析大规模数据集变得越来越重要。传统数据库在面对这种需求时往往表现不佳,这时候就需要一种专门用于搜索和分析的引擎。ElasticSearch (简称ES)就是这样一款强大的搜索引擎,它具有许多优势,使得它成为许多企业和开发者的首选。 简

    2024年02月09日
    浏览(48)
  • 【Elasticsearch学习笔记二】es的Mapping字段映射、Mapping字段常用类型、Mapping映射的创建、查看和更新、es数据迁移、ik分词器

    目录 1、Mapping字段映射概述 2、Mapping字段常用类型 3、映射中对时间类型详解 1)采取自动映射器来映射 2)手工映射提前指定日期类型 4、ES的keyword的属性ignore_above 5、Mapping映射的查看和创建 1)查看mapping信息:GET 索引名/_mapping 2)创建映射:PUT /索引名 3) 查看所有索引映

    2024年01月20日
    浏览(61)
  • Elasticsearch (ES) 搜索引擎: 文本搜索:分析器/分词器、同义词/停用词、拼音搜索、高亮显示、拼写纠错

    原文链接:https://xiets.blog.csdn.net/article/details/132349032 版权声明:原创文章禁止转载 专栏目录:Elasticsearch 专栏(总目录) 文本搜索主要指的就是全文搜索,全文搜索是搜索引擎的核心功能,与精确匹配的结构化数据不同,文本(text)数据在构建索引和搜索时都需要进行额外的处

    2024年02月03日
    浏览(58)
  • elasticsearch(ES)分布式搜索引擎03——(RestClient查询文档,ES旅游案例实战)

    文档的查询同样适用昨天学习的 RestHighLevelClient对象,基本步骤包括: 1)准备Request对象 2)准备请求参数 3)发起请求 4)解析响应 我们以match_all查询为例 3.1.1.发起查询请求 代码解读: 第一步,创建 SearchRequest 对象,指定索引库名 第二步,利用 request.source() 构建DSL,DSL中可

    2024年02月07日
    浏览(53)
  • 搜索引擎elasticsearch :安装elasticsearch (包含安装组件kibana、IK分词器、部署es集群)

    kibana可以帮助我们方便地编写DSL语句,所以还要装kibana 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络: 这里我们采用elasticsearch的7.12.1版本的镜像,这个镜像体积非常大,接近1G。不建议大家自己pull。 课前资料提供了镜像的tar包: 大家将

    2024年02月16日
    浏览(58)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包