ElasticSearch 系列文章

1 ES 入门之一 安装ElasticSearcha

2 ES 记录之如何创建一个索引映射

3 ElasticSearch 学习记录之Text keyword 两种基本类型区别

4 ES 入门记录之 match和term查询的区别

5 ElasticSearch 学习记录之ES几种常见的聚合操作

6 ElasticSearch 学习记录之父子结构的查询

7 ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询

8 ElasticSearch 学习记录之ES高亮搜索

9 ElasticSearch 学习记录之ES短语匹配基本用法

10 ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理

11 ElasticSearch 学习记录之集群分片内部原理

12 ElasticSearch 学习记录之ES如何操作Lucene段

13 ElasticSearch 学习记录之如任何设计可扩容的索引结构

14 ElasticSearch之 控制相关度原理讲解

扩容设计

扩容的单元

  • 一个分片即一个 Lucene 索引 ,一个 Elasticsearch 索引即一系列分片的集合

  • 一个分片即为 扩容的单元 。 一个最小的索引拥有一个分片。

  • 一个只有一个分片的索引无扩容因子

    -

  • 如何判断一个请求过来,我的信息在哪个分片上面

    • shard = hash(routing) % number_of_primary_shards
    • routing 大致是指文档的id

分片预分配

  • 一个分片存在于单个节点, 但一个节点可以持有多个分片

  • 一个拥有两个分片的索引可以利用第二个节点来存储数据

    -

  • Elasticsearch 中新添加的索引默认被指定了五个主分片

  • 为何不使用分片的分裂而是分片复制转移

    • 分裂分片是重新索引数据,比复制更重
    • 分裂是指数级的
    • 分裂需要足够大的空间

海量分片

  • 如何控制分片的数量
  • 分片的数据模型是什么
    • 一个分片的底层是Lucene索引,会消耗文件的句柄 内存 CPU 等
    • 每个搜索请求都会命中索引的每个分片,多个分片咋同一个节点上会竞争资源
    • 基于相关度的词频信息计算是基于分片的

容量规划

  • 如何根据自己的自身情况,来判断分片的多少
  • 可以根据下面的步骤,在特定环境中测定分片的多少
    • 基于生产的单个节点集群
    • 和生产相同的索引,知识他只有一个主分片无副本分片
    • 索引实际文档
    • 查询或聚合实际文档
    • 在真实的环境上运行,直到它挂掉。
    • 然后根据上面的信息,来进行分片的数量的计算

副本分片

  • 副本分片的主要目的就是为了故障转移

  • 如果持有主分片的节点挂掉了,一个副本分片就会晋升为主分片

  • 新文档首先被索引进主分片然后再同步到其它所有的副本分片

  • 副本分片可以服务于读请求

  • 可以通过增加副本的数目来提升查询性能

  • 一个拥有两个主分片一份副本的索引可以在四个节点中横向扩展

  • 过调整副本数来均衡节点负载

    • 原则上一个主分片不会它索引的副本分片在一起

多索引

  • 如何不停服务来增加容量

    • 创建一个新的索引存储数据
    • 同时搜索两个索引来获取新数据和旧数据
    • 使用索引别名来同时查询两个索引的数据

索引模板‘

  • 使用模板可以创建有用的索引

    创建索引模板

    PUT /_template/my_logs 创建一个名为 my_logs 的模板

    {

    "template": "logstash-*",

    将这个模板应用于所有以 logstash- 为起始的索引

    "order": 1, 这个模板将会覆盖默认的 logstash 模板,因为默认模板的 order 更低。

    "settings": {

    "number_of_shards": 1 限制主分片数量为 1

    },

    "mappings": {

    "default": { 为所有类型禁用 _all 域

    "_all": {

    "enabled": false

    }

    }

    },

    "aliases": {

    "last_3_months": {}

    添加这个索引至 last_3_months 别名中。

    }

    }

数据过期

  • 一次删除多个索引

    • DELETE /logs_2013* //使用通配符

      关闭旧的索引

    POST /logs_2014-01-/_flush 刷写(Flush)所有一月的索引来清空事务日志

    POST /logs_2014-01-
    /_close

    关闭所有一月的索引.

    POST /logs_2014-01-*/_open当你需要再次访问它们时,使用 open API 来重新打开它们。

归档旧索引数据

非常旧的索引 可以通过snapshot-restore API归档至长期存储

基于用户的数据

Elasticsearch 支持多租户所以每个用户可以在相同的集群中拥有自己的索引

一个用户一个索引”对大多数场景都可以满足

共享索引

利用别名实现一个用户一个索引

对子文档进行聚合操作

POST product/_search
{
"size": 0,
"aggs": {
"productSource": {
"terms": {
"field": "productSource"
},
"aggs": {
"prices": {
"children": {
"type": "price"
},
"aggs": {
"minPrice": {
"terms": {
"field": "minPrice"
}
}
}
}
}
}
}
}

ElasticSearch 学习记录之如任何设计可扩容的索引结构的更多相关文章

  1. ElasticSearch 学习记录之ES几种常见的聚合操作

    ES几种常见的聚合操作 普通聚合 POST /product/_search { "size": 0, "aggs": { "agg_city&quo ...

  2. ElasticSearch 学习记录之ES短语匹配基本用法

    短语匹配 短语匹配故名思意就是对分词后的短语就是匹配,而不是仅仅对单独的单词进行匹配 下面就是根据下面的脚本例子来看整个短语匹配的有哪些作用和优点 GET /my_index/my_type/_sea ...

  3. ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理

    分布式文档存储 ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 ...

  4. ElasticSearch 学习记录之ES高亮搜索

    高亮搜索 ES 通过在查询的时候可以在查询之后的字段数据加上html 标签字段,使文档在在web 界面上显示的时候是由颜色或者字体格式的 GET /product/_search { "si ...

  5. ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询

    ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...

  6. ElasticSearch 学习记录之父子结构的查询

    父子结构 父亲type属性查询子type 的类型 父子结构的查询,可以通过父亲类型的字段,查询出子类型的索引信息 POST /product/_search { "query": ...

  7. ElasticSearch 学习记录之Text keyword 两种基本类型区别

    ElasticSearch 系列文章 1 ES 入门之一 安装ElasticSearcha 2 ES 记录之如何创建一个索引映射 3 ElasticSearch 学习记录之Text keyword 两 ...

  8. Elasticsearch学习记录(分布式的特性)

    Elasticsearch学习记录(分布式的特性) 分布式的特性 我们提到Elasticsearch可以扩展到上百(甚至上千)的服务器来处理PB级的数据.然而我们的例子只给出了一些使用Elastics ...

  9. Elasticsearch学习记录(入门篇)

    Elasticsearch学习记录(入门篇) 1. Elasticsearch的请求与结果 请求结构 curl -X<VERB> '<PROTOCOL>://<HOST& ...

随机推荐

  1. 深入浅出多线程——ReentrantLock (二)

    深入浅出多线程——ReentrantLock (一)文章中介绍了该类的基本使用,以及在源码的角度分析lock().unlock()方法.这次打算在此基础上介绍另一个极为重要的方法newConditio ...

  2. SQL基础知识一

    一.建库 show databases ;//显示已存在的数据库 create database 数据库库名; use 数据库名;//进入新建的数据 二.建表 show tables;//查询已存在的 ...

  3. php简单实现发微博动态

    首先,肯定是注册成为开发者新浪微博开放平台 选择网站应用,填写一些基本信息 填完后在'我的应用'中,会看到刚创建的应用信息,我们只是简单的测试一下,所以其他复杂的注册信息都不用填写,有这些就够了 很重 ...

  4. javaScript 验证码 倒计时60秒

    <input type="button" id="btn" value="免费获取验证码" /> <script type ...

  5. dubbo源码—dubbo自定义spring xml标签

    dubbo为了和spring更好的集成,提供了一些xml配置标签,也就是自定义标签 spring自定义标签 spring自定义标签的方式如下: 设计配置属性和JavaBean 编写xsd文件,校验xm ...

  6. c++用类写栈和队列的简单基本操作(实验)

    继续更文.这次用类来写栈和队列,都是用数组模拟的: 以下是栈和队列的定义: 然后分别是栈和队列的类: 完整代码贴上: 栈 //使用类来定义栈 class ZHAN { public: STACK s; ...

  7. 大数据学习系列之六 ----- Hadoop+Spark环境搭建

    引言 在上一篇中 大数据学习系列之五 ----- Hive整合HBase图文详解 : http://www.panchengming.com/2017/12/18/pancm62/ 中使用Hive整合 ...

  8. OpenCASCADE入门指南

    OpenCASCADE入门指南 eryar@163.com 一.概述 荀子说“君子性非异也,善假于物也”.当你会用英语,就可以与世界各国的人交流:当你会用编程语言,就可以与计算机交流:当你会用数学语言 ...

  9. ActiveMQ基本详解与总结

    MQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们.消息传 ...

  10. Java IO(3)非阻塞式输入输出(NIO)

    在上篇<Java IO(2)阻塞式输入输出(BIO)>的末尾谈到了什么是阻塞式输入输出,通过Socket编程对其有了大致了解.现在再重新回顾梳理一下,对于只有一个“客户端”和一个“服务器端 ...