1:一条数据是如何落地到对应的shard上的

当索引一个文档的时候,文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?

首先这肯定不会是随机的,否则将来要获取文档的时候我们就不知道从何处寻找了。实际上,这个过程是根据下面这个算法决定的:

shard = hash(routing) % number_of_primary_shards

routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。 routing 通过 hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到 余数 。这个分布在 0 到 number_of_primary_shards-1 之间的余数,就是我们所寻求的文档所在分片的位置。

这就解释了为什么我们要在创建索引的时候就确定好主分片的数量 并且永远不会改变这个数量:因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了

2:路由机制

现在我们在探讨一个关于路由的问题:

假设你有一个100个分片的索引。当一个请求在集群上执行时会发生什么呢?

1. 这个搜索的请求会被发送到一个节点
2. 接收到这个请求的节点,将这个查询广播到这个索引的每个分片上(可能是主分片,也可能是复制分片)
3. 每个分片执行这个搜索查询并返回结果
4. 结果在通道节点上合并、排序并返回给用户

因为默认情况下,Elasticsearch使用文档的ID(类似于关系数据库中的自增ID),如果插入数据量比较大,文档会平均的分布于所有的分片上,这导致了Elasticsearch不能确定文档的位置,所以它必须将这个请求广播到所有的N个分片上去执行

这种操作会给集群带来负担,增大了网络的开销;

路由使用:

PUT my_index/my_type/1?routing=user1&refresh=true 
{
 "title": "This is a document"
}

GET my_index/my_type/1?routing=user1

上面的代码中,指定了一个用户属性作为路由进行分区,然后查询的时候也必须指定路由。这一点需要注意 只要在索引时候加入路由字段,那么在以后的get,delete,update操作中都必须使用路由字段,否则会出现问题。

有时候我们会把某些具有相似属性的数据放在同一个路由下,这样可以提高查询的效率;比如:我们把不同季度的销售数据存储在不同的路由下;然后在查询的时候,直接根据路由字段本身进行查询即可,而不需要直接扫描全年的数据:

PUT department1/order/1?routing=jidu1
{
 "productName" : "phone",
 "total_price" : 10000000,
 "times" : "2017-01-01"
}

PUT department1/order/2?routing=jidu1
{
 "productName" : "huawei",
 "total_price" : 10000000,
 "times" : "2017-2-01"
}
PUT department1/order/1?routing=jidu2
{
 "productName" : "phone",
 "total_price" : 10009000,
 "times" : "2017-5-01"
}

查询季度1的所有数据
GET department1/_search
{
 "query": {
   "terms" : {
     "_routing" : [ "jidu1" ]
  }
}
}

查询季度1和季度2的所有数据:
GET department1/_search
{
 "query": {
   "terms": {
     "_routing": [ "jidu1" , "jidu2"]
  }
}
}

当然,有时候我们需要查询第一、第二季度的产品中叫做huawei的文档。那么在查询中也是可以指定多个路由的:

GET department1/_search?routing=jidu1,jidu2 
{
 "query": {
   "match": {
     "productName": "huawei"
  }
}
}

注意:

如果加入路由字段之后,其他的操作(indexing,getting,deleting,updating)都必须指定路由字段,为了避免在使用时忘记添加 路由字段,导致同类数据会分布在多个shard上,这就违反了路由的原则,我们可以在mapping中 设置路由字段是必须字段,否则会提示错误:

PUT department1
{
"mappings": {
  "order": {
    "_routing": {
      "required": true
    }
  }
}
}

es之路由:进一步提高Elasticsearch的检索效率(适用大规模数据集)的更多相关文章

  1. ElasticSearch进阶检索

    ElasticSearch进阶检索 入门检索中讲了如何导入elastic提供的样本测试数据,下面我们用这些数据进一步检索 一.SearchAPI ES 支持两种基本方式检索 : 1.一种是通过使用 R ...

  2. Elasticsearch原理学习--为什么Elasticsearch/Lucene检索可以比MySQL快?

    转载于:http://vlambda.com/wz_wvS2uI5VRn.html 同样都可以对数据构建索引并通过索引查询数据,为什么Lucene或基于Lucene的Elasticsearch会比关系 ...

  3. NN:神经网络算法进阶优化法,进一步提高手写数字识别的准确率—Jason niu

    上一篇文章,比较了三种算法实现对手写数字识别,其中,SVM和神经网络算法表现非常好准确率都在90%以上,本文章进一步探讨对神经网络算法优化,进一步提高准确率,通过测试发现,准确率提高了很多. 首先,改 ...

  4. 小小知识点(四十八)——发送端已知CSI,基于预编码技术,进一步提高MIMO系统和用户的吞吐量

    1.预编码技术的概念 对于空间复用,LTE既支持开环方式的空间复用(发端未知CSI),也支持闭环方式的空间复用(发端已知CSI) 对于LTE中闭环方式的空间复用(即预编码系统)中,发射机可以根据信道条 ...

  5. 【年度开源、工具合集】牛津计划,DMTK,Graph Engine…提高你的工作效率!

    本篇合集包括以下三个部分的内容: 1.微软亚洲研究院过去一年的所有开源合集,如分布式机器学习工具包DMTK等. 2.利用微软研究院的技术提高工作效率的工具合集,如让没有机器学习背景的开发人员也能开发出 ...

  6. (转)对《30个提高Web程序执行效率的好经验》的理解

    阅读了博客园发布的IT文章<30个提高Web程序执行效率的好经验>,这30条准则对我们web开发是非常有用的,不过大家可能对其中的一些准则是知其然而不知其所以然. 下面是我对这些准则的理解 ...

  7. 提高MySQL数据库查询效率的几个技巧(转载)

    [size=5][color=Red]提高MySQL数据库查询效率的几个技巧(转)[/color][/size]      MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我 ...

  8. Ionic进行PC端Web开发时通过脚本压缩提高第一次加载效率

    1. 问题 1.1. 问题上下文描述: 基于Ionic进行PC端的Web应用开发: 使用Tomcat作为最终服务发布容器. 1.2. 问题描述: 编译后main.js的大小为4-6MByte.(集成第 ...

  9. 从如何优化SQL入手,提高数据仓库的ETL效率

    1        引言数据仓库建设中的ETL(Extract, Transform, Load)是数据抽取.转换和装载到模型的过程,整个过程基本是通过控制用SQL语句编写的存储过程和函数的方式来实现对 ...

随机推荐

  1. 初步学习jquery学习笔记(五)

    jquery学习笔记五 jquery遍历 什么是遍历? 从某个标签开始,按照某种规则移动,直到找到目标标签为止 标签树 <div> <ul> <li> <sp ...

  2. CSP-S 2019游记

    Day 0 下午到了广州,酒店还不错,不好的是附近没有什么吃饭的地方 zyd和ljz巨神说如果上了450就女装. 晚上看了一下写过模板,本来准备敲几个新模板的的结果被卡常,心态没了.于是又把wys的卡 ...

  3. mknod创建设备(加载新的设备驱动时候,通常会用到此命令)

    mknod - make block or character special filesmknod [OPTION]... NAME TYPE [MAJOR MINOR] option 有用的就是- ...

  4. 【BZOJ-4289】Tax 最短路 + 技巧建图(化边为点)

    题意 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权N<=10 ...

  5. npm 关联 git包

    npm 关联 git包 由于现在项目越做越多,很多公共的部分相互公用,需要尽可能早地提炼出来,这样便可以在其他项目进行引用,而不是每次建一个项目就需要进行拷贝,这样太痛苦了,因而想通过类似npm包管理 ...

  6. sql server 对数运算函数log(x)和log10(x)

    --LOG(x)返回x的自然对数,x相对于基数e的对数 --LOG10(x)返回x的基数为10的对数 示例:select LOG(3),LOG(6),LOG10(1),LOG10(100),LOG10 ...

  7. springcloud-概念

    springcloud-概念 一.架构演进过程 单体架构----分布式架构----SOA(eg.dubbo)服务治理架构----微服务 随着互联网的发展,需求的激增致使网站应用规模的扩大,最后转成了技 ...

  8. 为什么 Android 开发者都应该尝试一下 Anko?

    简评: 这里介绍的仅仅是 Anko 中很小的一部分,Kotlin + Anko 真的让 Android 开发简化了不少,用了 Anko 基本就可以告别那些什么 Android 不得不知的代码收集贴了. ...

  9. Zookeeper客户端使用(使用zkclient)

    Zookeeper客户端使用 二.使用zkclient 在pom.xml中加入依赖 <dependency> <groupId>com.101tec</groupId&g ...

  10. javascript的基础知识点

    一:鼠标提示框 需求描述:鼠标移入都input上,div显示,移出,div消失 分析:控制display=block/none 鼠标移入,鼠标移出事件  <input type="bu ...