ElasticSearch之文档、索引和基本API
文档(Document)
-
Elasticsearch是面向文档的,文档是所有可搜索数据的最小单元。(可以理解为数据库中的一条记录)
- 日志文件中的日志项
- 一本电影的具体信息/一张唱片的详细信息
- MP3播放器里的一首歌/一篇PDF文档中的具体内容
-
文档会被序列化成JSON格式,保存在Elasticsearch中
- JSON对象由字段组成
- 每个字段都有对应的字段类型(字符串、数值、布尔、日期、二进制、范围类型)
-
每个文档都有一个UniqueID
- 你可以自己指定ID
- 或者通过Elasticsearch自动生成
JSON文档
- 一篇文档包含了一系列的字段。类似于数据库表中的一条记录。
- JSON文档格式灵活,不需要预先定义格式(不需要和数据库那样提前定义表结构,提供建表语句等)
- 字段的类型可以自己指定,也可以通过Elasticsearch自动推算。
- 支持数组/嵌套。
文档的元数据
{
"_index" : "index",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "程大帅"
}
}
- _index:文档所属的索引
- _type:文档所属的类型名
- _id:文档的唯一id
- _source:文档的原始JSON数据
- _all:整合所有字段内容到该字段(废除)
- _version:文档的版本信息
- _source:相关性打分
索引
概念:简单说索引是文档的容器,是一类文档的结合(类似于数据库中的表)
- 每个索引都有自己的mapping定义,用于定义包含文档的字段名和字段类型
- Shard体现了物理空间的概念,索引中的数据分布在不同的shard上。
- Mapping定义了索引字段的名称和类型
- Setting定义不同的数据分布
{
"index" : { // 索引名
"aliases" : { },
"mappings" : {
"properties" : {
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1",
"provided_name" : "index",
"creation_date" : "1639913482690",
"number_of_replicas" : "1",
"uuid" : "Qxkdm_RvT-uHH3XiYJEpSg",
"version" : {
"created" : "7160099"
}
}
}
}
}
索引的不同语义
索引(动词)文档到Elasticsearch的索引(名词)中
名词:一个Elasticsearch集群中,可以创建很多个不同的索引。
动词:保存一个文档到Elasticsearch的过程也叫做索引(indexing)。ES中,可以理解为创建一个倒排索引的过程
名词:我们通常理解的索引:B树索引,倒排索引
Type
在7.0之前,一个index可以设置多个Types
在6.0开始,Type已经被废弃。7.0开始一个索引只能创建一个Type ——”_doc“。
传统关系型数据库和es结构对比
es 提供高性能的全文检索,对搜索结构进行聚合分析等。
RDMS提供事务性,联合查询等。
关系型数据库 | Elasticsearch |
---|---|
Table | Index(type) |
Row | Document |
Column | Filed |
Schema | Mapping |
SQL | DSL |
什么是数据建模?
数据建模是创建数据模型的过程。
数据模型是对真实世界进行抽象描述的一种工具和方法,实现对像是世界的映射。
三个过程:概念模型 - 逻辑模型 - 数据模型(遵循第三范式)
数据模型:结合具体的数据库,在满足业务读写性能等需求的前提下,确定最终定义。
如何对字段进行建模?
字段类型 - 是否需要搜索及分词 - 是否需要聚合及排序 - 是否需要额外的存储
字段类型
-
Text
- 用于全文本字段,文本会被Analyzer分词
- 默认不支持聚合分析及排序。需要设置fielddata为true
-
Keyword
- 用于id、枚举、不需要分词的文本。如:电话号码,email地址,手机号码,邮政编码,性别等。
- 适用于Filter(精准匹配),Sorting和Aggregations
-
设置多字段类型
- 默认会为文本类型设置成text,并设置一个keyword的子字段
- 在处理人类语言时,通过增加“英文”,“拼音”和“标准”分词器,提高搜索结构