前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ElasticSearch之index type mapping

ElasticSearch之index type mapping

作者头像
saintyyu
发布2021-11-22 09:50:21
1.2K0
发布2021-11-22 09:50:21
举报
文章被收录于专栏:IT专栏IT专栏

生活中的数据总体上可以分为两种:

结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。指具有固定格式或有限长度的数据,如数据库,元数据等。

非结构化数据:又可称为全文数据,不定长或无固定格式,不适于由数据库二维表来表现,包括所有格式的办公文档、XML、HTML、Word 文档,邮件,各类报表、图片和音频、视频信息等。

说明:如果要更细致区分的话,XML、HTML 可划分为半结构化数据。因为它们也具有自己特定的标签格式,所以既可以根据需要按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。

对于这两种数据分类,搜索也相应分为两种:

结构化数据搜索:因为它们具有特定的结构,所以我们一般都是可以通过关系型数据库(MySQL,Oracle 等)的二维表(Table)的方式存储和搜索,也可以建立索引。

非结构化数据搜索:将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。将非结构化数据变得结构化的得到的就叫做倒排索引(关于倒排索引的更多介绍,参见ElasticSearch倒排索引)。ElasticSearch就是利用倒排索引对非结构化数据进行存储和高效检索。下面以传统数据库做类比分析。

在ElasticSearch中存储数据的行为就叫做索引(indexing)。在ElasticSearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,类比传统关系数据库:

ElasticSearch集群可以包含多个索引(indices)(数据库),每个索引可以包含多个类型(types)(表),每个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

【索引】含义的区分

索引(名词):一个索引就像是传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices或indexes。

索引(动词):“索引一个文档”表示把文档存储到索引(名词)里,以便它可以被检索或者查询。这很像SQL中的insert关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档。

倒排索引:传统数据库为特定列增加一个索引,例如B-Tree索引来加速检索。ElasticSearch和Lucene使用一种叫做倒排索引的数据结构来达到相同的目的。

由于ElasticSearch中的document使用JSON格式来存储的,因而默认情况下,文档中的所有字段都会被索引(拥有一个倒排索引),只有这样它们才是可以被索引的。这里的所有字段是指:json中的key(详见ElasticSearch倒排索引中的示例)。

关于type的理解

type是一个index中用来区分相似数据的,但是可能有不同的fields,而且有不同的属性来控制索引建立、分词器。field的value值在底层的lucene中建立索引的时候,全部是opaque bytes类型,不区分类型的。lucene是没有type的概念的,在document中,实际上将type作为一个document的field来存储,即_type,es通过_type来进行type的过滤和筛选。一个index中的多个type,实际上是放在一起存储的,因此一个index下,不能有多个type重名但是类型或其他设置不同,因为那样是无法处理的。

在es内部,会把所有field合并,对一个type中没有的field就用空值替代。所以在一个index下不同type的同名field的类型必须一致,否则就会冲突。最佳实践,将类似结构的type放在一个index下,这些type应该有多个field是相同的。因为如果将两个type的field完全不同的类型放在同一个index下,那么就每条数据都至少有一半的field在底层的lucene中是空值,会有严重的性能问题。

关于es为什么要移除type

1、index、type的初衷

之前es将index、type类比于关系数据库中的database、table,这么考虑的目的是“方便管理数据之间的关系”。

2、为什么现在要移除type

2.1 在关系类型数据库中table是独立的(独立存储),但es中同一个index中不同type是存储在同一个索引中的(lucene的索引文件),因此不同type中相同名字的字段的定义(mapping)必须一致。

2.2 不同类型(type)的“记录”存储在同一个index中,会影响lucene的压缩性能。因为在es内部,会把同一个index下不同type中的所有field合并,对于一个type中没有的field就用空值代替。因此,如果两个type的field完全不同,却放在一个index下,那么每条数据至少有一半的field在底层的lucene中是空值,会有严重的性能问题。

3、替换策略

3.1 一个index只存储一种类型(type)的“记录”

这种方案的优点:

a)lucene索引中数据比较整齐(相对于稀疏),利于lucene进行压缩。

b)文本相关性打分更加精确(tf、idf,考虑idf中命中文档总数)

3.2 用一个字段来存储type

如果有很多规模比较小的数据表需要建立索引,可以考虑放到同一个index中,每条记录添加一个type字段进行区分。

这种方案的优点:

a)es集群对分片数量有限制,这种方案可以减少index的数量。

这种方案本质上还是3.1方案,因为索引下还是只有一个type。

4、迁移方案

之前一个index上有多个type,如何迁移到3.1、3.2方案?

4.1 先针对实际情况创建新的index,[3.1方案]有多少个type就需要创建多少个新的index,[3.2方案]只需要创建一个新的index。

4.2 调用_reindex将之前index上的数据同步到新的索引上。

关于mapping

es的mapping类似于关系型数据库的数据表定义(ddl),示例如下:

1、创建新的索引(index)

代码语言:javascript
复制
PUT /indexTest

返回结果:

代码语言:javascript
复制
{
    "acknowledged":true,
    "shards_acknowledged":true,
    "index":"indexTest"
}

2、创建mapping

2.1 首先查看刚刚创建的索引的mapping是什么样子:

代码语言:javascript
复制
GET /indexTest/_mapping

返回:

代码语言:javascript
复制
{
    "indexTest":{
        "mapping":{}
    }
}

可见新建的索引中,mapping是一个空集。

2.2 创建mapping:

代码语言:javascript
复制
POST /indexTest/product/_mapping?pretty
{
    "product":{
        "properties":{
            "title":{
                "type":"text",
                "store":"true"
            },
            "description":{
                "type":"text",
                "index":"false"
            },
            "price":{
                "type":"double"
            },
            "onSale":{
                "type":"boolean"
            },
            "type":{
                "type":"integer"
            },
            "createDate":{
                "type":"date"
            }
        }
    }
}

再次执行mapping查询指令得到:

代码语言:javascript
复制
{
    "indexTest":{
        "mapping":{
            "product":{
                "properties":{
                    "title":{
                        "type":"text",
                        "store":"true"
                    },
                    "description":{
                        "type":"text",
                        "index":"false"
                    },
                    "price":{
                        "type":"double"
                    },
                    "onSale":{
                        "type":"boolean"
                    },
                    "type":{
                        "type":"integer"
                    },
                    "createDate":{
                        "type":"date"
                    }
                }
            }
        }
    }
}

3、插入数据:

代码语言:javascript
复制
POST /indexTest/product
{
  "title": "test title 001",
  "description": "this is a random desc ",
  "price": 22.6,
  "onSale": "true",
  "type": 2,
  "createDate": "2018-01-12"

}

由此可见,mapping就是定义了index中的数据结构,类似于Mysql的DDL定义表结构。

参考文档:

1、《elasticsearch权威指南》

2、https://www.cnblogs.com/liuqianli/p/8475477.html es中的type数据类型

3、https://www.cnblogs.com/huangfox/p/9460361.html es为什么要移除type

4、https://blog.csdn.net/qq_15958689/article/details/79524291 ES(ElasticSearch) 索引创建

5、https://maimai.cn/article/detail?fid=1302443404&efid=CMeD__mXKvERfvRz34KMaA&from=singlemessage?看完这篇还不会Elasticsearch,我跪搓衣板

6、https://blog.csdn.net/Saintyyu/article/details/103076723?ElasticSearch倒排索引

7、https://blog.csdn.net/m0_38052384/article/details/103701051?Elasticsearch: 在主分片和复制分片上执行写、检索、局部更新的必要步骤

8、https://www.cnblogs.com/xjh713/p/10630887.html?elasticsearch读写原理

本文参与?腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体同步曝光计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于type的理解
  • 关于es为什么要移除type
  • 关于mapping
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com