elasticsearch可以使用preference参数来指定分片查询的优先级,使用时就是在请求url上加上preference参数,如:http://ip:host/index/_search?preference=_primary
java的调用接口翻译为:client.prepareSearch("index").setPreference("_primary")。
默认情况下es有5种查询优先级:
_primary: 指查询只在主分片中查询
_primary_first: 指查询会先在主分片中查询,如果主分片找不到(挂了),就会在副本中查询。
_local: 指查询操作会优先在本地节点有的分片中查询,没有的话再在其它节点查询。
_only_node:指在指定id的节点里面进行查询,如果该节点只有要查询索引的部分分片,就只在这部分分片中查找,所以查询结果可能不完整。如_only_node:123在节点id为123的节点中查询。
Custom (string) value:用户自定义值,指在参数cluster.routing.allocation.awareness.attributes指定的值,如这个值设置为了zone,那么preference=zone的话就在awareness.attributes=zone*这样的节点搜索,如zone1、zone2。关于这个值作用可以参考下面文章。
虽然es有提供这5种优先级,但感觉还是不能满足我的需求,我是想能指定在某一个或多个节点中查询,比如node1和node2里面的分片能组成一个完整的索引,那我可以只在node1和node2中搜索就行了。看来只能改源码解决,改源码也非常简单。
首先找到org.elasticsearch.cluster.routing.operation.plain.PlainOperationRouting这个类,es搜索时获取分片信息是通过这个类的。它的preferenceActiveShardIterator()方法就是根据条件来找出响应的分片。看源码可知其主要是根据preference这个参数来决定取出的分片的。如果没有指定该参数,就随机抽取分片进行搜索。如果参数以_shards开头,则表示只查询指定的分片。注意,这个功能官网的文档中没有写到。
然后下面就是判断我上面说的5种优先级情况。我们现在要加个多节点分片查询的功能,仿照单个节点分片查询(指_only_node)就行了,在
if (preference.startsWith( "_only_node:" )) { return indexShard.onlyNodeActiveShardsIt(preference.substring( "_only_node:" .length())); } |
后面加上
if (preference.startsWith( "_only_nodes:" )) { return indexShard.onlyNodesActiveShardsIt(preference.substring( "_only_nodes:" .length())); } |
onlyNodesActiveShardsIt这个方法在org.elasticsearch.cluster.routing.IndexShardRoutingTable中是没有的,要自己写。加上
/** * Prefers execution on the provided nodes if applicable. */ public ShardIterator onlyNodesActiveShardsIt(String nodeIds) { String[] ids = nodeIds.split( "," ); ArrayList<ShardRouting> ordered = new ArrayList<ShardRouting>(shards.size()); // fill it in a randomized fashion for ( int i = 0 ; i < shards.size(); i++) { ShardRouting shardRouting = shards.get(i); for (String nodeId:ids){ if (nodeId.equals(shardRouting.currentNodeId())) { ordered.add(shardRouting); } } } return new PlainShardIterator(shardId, ordered); } |
重新编译源码就行了。查询时加上?preference=_only_nodes:node1id,node2id 就可以指定在node1和node2中搜索
相关推荐
分布式搜索引擎ElasticSearch思维导图,ES思维带图。分布式搜索引擎ElasticSearch思维导图,ES思维带图。分布式搜索引擎ElasticSearch思维导图,ES思维带图。分布式搜索引擎ElasticSearch思维导图,ES思维带图。...
分享一套完整版视频课程——分布式搜索引擎Elasticsearch开发实战基础篇 (ElasticSearch、ELK、搜索引擎、Lucene),本教程旨在带领大家进入搜索引擎领域,从无到有,深入浅出的讲解了什么是搜索引擎,搜索引擎的...
- **分布式架构**:Elasticsearch 采用分布式架构,能自动处理节点间的通信和数据分片,保证系统的高可用性和容错性。 - **实时性**:数据一旦写入,立即可用于搜索,无需额外的刷新操作。 - **弹性伸缩**:随着数据...
分布式搜索是现代大数据处理的关键技术之一,而Elasticsearch作为其中的佼佼者,因其高效、灵活和可扩展性而广泛应用于各种场景。本篇将深入探讨Elasticsearch的基础知识,涵盖其核心概念、环境搭建、配置管理以及...
ElasticSearch通过分片(sharding)和复制(replication)机制,来实现数据的分布式存储和查询的负载均衡。分片可以将数据分布到多个节点上,而复制则能保证高可用性和容错性。 全文搜索系统中一个关键的组成部分是...
Elasticsearch查询客户端是用于与ES服务器通信的软件,它们提供了多种语言的API,允许开发者以编程方式执行索引、搜索、更新和删除等操作。常见的Elasticsearch客户端包括: - **Jest**:一个轻量级的Java REST...
4. 分布式ElasticSearch的作用:ElasticSearch是一个基于Lucene构建的开源全文搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。在该研究中,ElasticSearch被用于存储元数据,并通过...
Elasticsearch分布式大数据搜索
**Elasticsearch分布式搜索引擎 v7.17.18** Elasticsearch是一个开源的、高度可扩展的全文搜索引擎,基于Lucene构建,旨在提供实时、分布式、容错能力强的搜索和数据分析能力。在v7.17.18版本中,Elasticsearch继续...
本篇将详细介绍分布式搜索引擎,特别是Elasticsearch的写入和查询工作流程,以及与Java高并发API的关联。 首先,我们要理解Elasticsearch的分布式架构。它基于Lucene构建,设计为分布式的、具有自动故障恢复特性的...
**Elasticsearch:分布式搜索与分析的利器** Elasticsearch,作为一个实时的、高度可扩展的分布式搜索和分析引擎,引领了现代数据检索的新潮流。它不仅提供了强大的全文搜索引擎,而且具备了处理海量数据的优秀性能...
Elasticsearch(简称ES)是一款基于Lucene的开源、实时、分布式全文搜索引擎,它不仅提供了搜索功能,还能进行数据分析和可视化。本篇文章将深入探讨ES分布式搜索引擎的安装过程、工作原理以及其在实际应用中的优势...
牛客Java高级工程师 第6章 Elasticsearch,分布式搜索引擎\牛客Java高级工程师-第六章 Elasticsearch,分布式搜索引擎 .pdf 牛客Java高级工程师 第6章 Elasticsearch,分布式搜索引擎\第六章素材和源码\community-...
Elasticsearch(简称ES)是一个基于Apache Lucene构建的开源、分布式、RESTful风格的搜索和数据分析引擎。它允许你以前所未有的速度和规模,即时地存储、搜索和分析大量数据。Elasticsearch通常用于全文搜索、结构化...
Elasticsearch分布式搜索引擎是当前搜索引擎技术中的一个热点,尤其在处理大规模、实时的搜索数据方面显示出其独特的优越性。本文档主要讨论Elasticsearch在地名地址检索领域的应用,这种搜索引擎技术正在被广泛应用...
Elasticsearch是一个开源的分布式搜索和分析引擎,构建在Apache Lucene之上。它提供了一套强大的API和工具,可以实现分布式全文搜索、结构化和非结构化数据分析、日志存储和实时数据可视化等功能。 以下是一些...
《实战Elasticsearch、Logstash、Kibana++分布式大数据搜索与日志挖掘及可视化解决方案》这本书涵盖了在大数据环境中如何高效地实现数据搜索、处理、分析以及可视化的关键技术和工具。以下是该书所涉及的核心知识点...
对于Elasticsearch(ES)这样的分布式搜索引擎来说,合理利用操作系统级别的缓存机制可以显著提升查询效率。我们应关注缓存的配置,如设置合适的缓存大小,以及优化数据访问模式以充分利用缓存优势。 其次,PPT....
### Elasticsearch:开源分布式搜索与分析引擎 #### 一、简介 Elasticsearch 是一款由 Elasticsearch N.V.(现 Elastic N.V.)开发并维护的开源分布式搜索和分析引擎。其核心特性包括分布式搜索引擎、实时数据分析...
集成Redis缓存、消息队列(RabbitMq、RocketMQ)、分布式搜索ElasticSearch 个人花大量时间整理出的实战资料,内容丰富,文档也很详细。无论做毕业设计还是用于学习技能,或工作中当做参考资料,都能发挥重要作用 亲们...