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查询大文本效率_es之路由:进一步提高Elasticsearch的检索效率(适用大规模数据集)...相关推荐

  1. es查询大文本效率_进一步提高Elasticsearch的检索效率

    Elasticsearch的路由机制与其分片机制有着直接的关系.Elasticsearch的路由机制即是通过哈希算法,将具有相同哈希值的文档放置到同一个主分片中.这个和通过哈希算法来进行负载均衡几乎是 ...

  2. es查询大文本效率_【搜索引擎】 4-ES在大数据量下提高查询效率方案

    在一些公司里,很多数据都喜欢丢到 ES 里,甚至有的人把其充当数据库的使用,这样是很危险的.很可能过个半年一年ES数据量就很大了,然后当时的申请的ES机器配置不高,查询速度变慢.所以,一开始架构评审应 ...

  3. es查询大文本效率_es中terms查询速度能否优化

    es表结构如下:PUT demo/ { "mappings": { "demo": { "_all": { "enabled&qu ...

  4. oracle查询大文本类型转化为string

    有时候oracle大文本类型查询时,数据库字段无法显示成字符串,如何转化为字符串,可以使用以下方法 select dbms_lob.substr(content) from a;

  5. Java查询大文本文件的处理方法

    有时我们需要查询大文本而不是数据库,这时就需要流式读入文件并实现查询算法,还要进行并行处理以提高性能.但JAVA本身缺少相应的类库,需要硬编码才能实现结构化文件计算,代码复杂且可读性差,难以实现高效的 ...

  6. java并行计算同步返回_Java大文本并行计算实现过程解析

    Java大文本并行计算实现过程解析 简单提高文本读取效率,使用BufferedReader是个不错的选择.速度最快的方法是MappedByteBuffer,但是,相比BufferedReader而言, ...

  7. WIN10:提高生产力与工作效率实用软件推荐

    作为一名研究僧,本文旨在分享自己在科研期间经常使用的提高生产力与工作效率实用软件,实测可以提高不少生产力与效率,节约自身的宝贵时间,并且分享自己在使用时碰到的各种问题解决方法与小技巧分享. (注:部分 ...

  8. es 删除数据_es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?...

    面试题 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗? 面试官心理分析 问这个,其实面试官就是要看看你了解不了解 es 的一些基 ...

  9. Elasticsearch(一)——Es安装(三个必安工具、安装各种类型分词器)、Es 十大核心概念、通过 Kibana 操作 Es(中文分词、Es各种索引命令操作)

    Elasticsearch(一)--Es安装(三个必安工具.安装各种类型分词器).Es 十大核心概念.通过 Kibana 操作 Es(中文分词.Es各种索引命令操作) 一.Elasticsearch ...

最新文章

  1. java kafka分布式_Kafka分布式消息系统
  2. 从URL中获取搜索关键字
  3. vsftpd Problem with 425 Security: Bad IP connecting 解决
  4. 【Protocol Buffer】Protocol Buffer入门教程(八):Windows平台部署Protobuf环境
  5. Uploadify——学习(1):在Struts2的使用
  6. Cenos6.4下远程连接mysql报错1130
  7. 2021年10月到12月一个月学习总结2
  8. 七、线性表的链式存储结构
  9. 总结几种结构体初始化方法 (转)
  10. 易语言服务端与客户端怎么传送_配置中心是怎么推送的?动手实现一个 Long Polling 长轮询...
  11. 【Java从0到架构师】git 核心原理和分支管理
  12. 清华大学 计算机系 研究生导师,清华大学计算机科学与技术系研究生导师简介-胡事民...
  13. java根据id查询名字_Mybatis根据id查询用户信息
  14. 【C++】关于strlen函数使用的坑(与socket sendto函数配合使用)
  15. 定义标准的POJO类
  16. python 视频剪辑_视频剪辑什么鬼?Python 带你高效创作短视频
  17. php连接mysql数据库 简洁代码
  18. 蚂蚁迷宫—有限状态机设计(ANT MAZE)
  19. 数据库管理系统的层次结构--物理组织
  20. 《东周列国志》第八十七回 说秦君卫鞅变法 辞鬼谷孙膑下山

热门文章

  1. 现代制造工程——第七章(轧制和锻造)
  2. 将字符串和数字合并动态写入
  3. serialversionuid的作用_为什么阿里Java规约要求谨慎修改serialVersionUID字段
  4. python class用法_python原类、类的创建过程与方法
  5. 苹果电脑删除软件_软件自动开启很烦人?如何彻底关掉开机自动开启的应用程序...
  6. apache 设置404 页面_SpringBoot自定义错误页面
  7. 从壹开始 [vueAdmin后台] 之三 || 动态路由配置 项目快速开发
  8. K-means算法和矢量量化
  9. 【循序渐进学Python】6.Python中的函数
  10. linux ifconfig命令参数及用法详解--linux查看配置网卡命令