主要总结一下es的索引结构,看看一个索引是怎么储存在多个节点中,又是如何从多个节点上获得搜索结果的。
网上看到的两句话,特别有意思:
一切设计都是为了提高搜索性能
Elasticsearch索引的思路是将硬盘的东西尽可能搬到内存中,减少硬盘随机读写次数(同时利用硬盘顺序读写的特性),
结合各种奇技淫巧的压缩算法,用其及其苛刻的态度使用内存
基本术语
在Elasticsearch中,索引的逻辑结构分为下面几个层次: 索引->类型->文档(document),
从储存结构上看可以分为:分片(shard)->段(segment)->文档(document)->域(field)->词(term)
还有下面的一些术语:
文档
: Elasticsearch的基本结构,采用json表示,每一个文档是独立的,每个文档都包含了字段名和值,文档是字段不一定完全相同,
当相同类型的文档,类型必须相同索引 Index
: 索引是类型的容器,每一个索引都包含一个以上的类型和一些配置,例如: 分片数量,刷新时间等等类型Type
: 一个类型中可以包含多个文档,每一个类型都有一个自己的映射(mapping),这个映射描述了字段的类型和相关的配置参数域field
: 具体索引的字段
ES索引的配置参数
{
"settings":{
"number_of_shards": "16",
"number_of_replicas": "1",
"refresh_interval": "-1",
"index.codec": "best_compression"
},
"mappings": {
"fourtb": {
"_all": { "enabled": false},
"_source": { "enabled": true},
"properties": {
"length": {"index": "no", "store": "no", "type": "integer"}
}
}
}
}
先说_all和_source,如果开启了_all,则会将所有的字段合在一起,创建一个新的field,这样就可以指定field进行搜索
而_source则会将文本储存起来,这样可以查询的时候可以完整返回原来的数据。
索引的基本参数有:
index
: 参考值:no
(不建立索引,不能被搜索的字段),not_analyzed
(整个关键词会被储存为关键词),analyzed
(默认采用standard分析器)store
: 参考值:true
,false
,单独储存原始文本,独立储存的字段越多,索引越大,更大的索引会减慢建立索引和搜索的速度type
: 索引的数据类型,ES对不同的类型会采用不同的策略,下面是对类型的详细介绍
这里store和_source的意思相近,都是单独储存原始文本,但是还是有很多的区别的。
store是指field的存储,如果开启,则会单独储存这个field,在对index进行查询的时候,可以返回这个field的原始值,
但是在每次读取field的值都是读硬盘的一次读取,代价也是比较高的。_source是对整个索引的储存,可以进行压缩,在查询的时候可以返回原始的索引,如果不开启,就只能返回开启了store的field,
另外,如果我们要获取fiel的话,可以直接从_source上分析提取,所以读取硬盘的次数也少一些。但是如果我们需要频繁获取一个字段的数据,而且source比较大的情况下,单独储存这个field会比从source上提取要快。
简单来说,开了_source就能返回全部的原始数据,store是表明是否开启单独储存的
下面是一些常见的索引类型,并不是全部,具体的还要去看参考手册:
| 类型 | 说明 |
| :-: | :-: |
| text | 在ES5.x之后,将string类型拆分为text和keyword,text对应的是全文搜索,text会被切开,分为多个term建立索引,可以对这个field进行模糊搜索,但是text不能进行排序或者聚合操作 |
| keyword | 这个类型一般用于邮箱地址,用户名,tag等等,需要精确匹配,一般可以用于聚合,排序,过滤等等操作,对于部分特殊的字段,可以建立多个域,text和keyword,分别使用不同的需求 |
| Numeric | 数字类型保存long,integer,short,byte,double,float,half_float,scaled_float等等 |
| date | 日期类型,可以指定日期的格式 |
| ip | 没什么好说的 |
| boolean | 也是没什么好说的 |