stone

elasticsearch-索引篇
主要总结一下es的索引结构,看看一个索引是怎么储存在多个节点中,又是如何从多个节点上获得搜索结果的。网上看到的两句...
扫描右侧二维码阅读全文
29
2017/03

elasticsearch-索引篇

主要总结一下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: 参考值:truefalse,单独储存原始文本,独立储存的字段越多,索引越大,更大的索引会减慢建立索引和搜索的速度
  • 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 | 也是没什么好说的 |

参考资料

Last modification:September 7th, 2018 at 08:20 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment