elasticsearch源码分析之search模块(client端)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介:

elasticsearch源码分析之search模块(client端) 

注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们可以简单地概括为将的数据请求发送到node,然后在对返回的结果做处理并返回给调用方,话虽如此,但是过程并非那么简单。

请求初始化

1、api的注册,上一篇已经提到了,所以的api都是通过Guice框架注册进来的,在注册的时候会在controller上将不同的url绑定到不同的handler中:

controller.registerHandler(GET, "/_search", this); controller.registerHandler(POST, "/_search", this); controller.registerHandler(GET, "/{index}/_search", this); controller.registerHandler(POST, "/{index}/_search", this); controller.registerHandler(GET, "/{index}/{type}/_search", this); controller.registerHandler(POST, "/{index}/{type}/_search", this); controller.registerHandler(GET, "/_search/template", this); controller.registerHandler(POST, "/_search/template", this); controller.registerHandler(GET, "/{index}/_search/template", this); controller.registerHandler(POST, "/{index}/_search/template", this); controller.registerHandler(GET, "/{index}/{type}/_search/template", this); controller.registerHandler(POST, "/{index}/{type}/_search/template", this); 

上述的url都属于search的范畴,

2、当接收到请求后,client端会parseSearchRequest,对于请求进行解析,解析结果用一个SearchRequest来表示,我们来看看包含哪些内容:

其他的不多说,特别地,对于source的解析是核心所在,由parseSearchSource来完成,返回一个SearchSourceBuilder,其主要包含:

private QuerySourceBuilder querySourceBuilder;

private QueryBuilder postQueryBuilder; private BytesReference filterBinary;

其实就相当于分解动作了,所以的search不外乎都是由这些要素组成,主要包括query、filter、aggs等等。

请求的执行

1、接下来,client会将send request:client.search(searchRequest, new RestStatusToXContentListener<SearchResponse>(channel));,其中channel用于处理回调,返回的类型为SearchResponse

2、对应action的构建:

public void search(final SearchRequest request, final ActionListener<SearchResponse> listener) { execute(SearchAction.INSTANCE, request, listener); } 

其中SearchAction.INSTANCE就是一个search action的实例。listener监听回调。

3、用proxy来发送请求到server,上面的proxy其实是一个TransportProxyClient的实例,在Transport模块中其实已经说过了,请求都是由proxy的发送的:

protected <Request extends ActionRequest, Response extends ActionResponse, RequestBuilder extends ActionRequestBuilder<Request, Response, RequestBuilder>> void doExecute(Action<Request, Response, RequestBuilder> action, Request request, ActionListener<Response> listener) { proxy.execute(action, request, listener); } 

底层还是调用的TransportService的sendRequest,而发送到的node由DiscoveryNode node = nodes.get((index) % nodes.size());来决定,可以理解为轮训选取一个node(其实这里看到的和我之前的理解是有些大不一样了,我一直以为client端是直接发送给不同的shard所在的node上,再把结果合并起来的,难道之前理解是错的???)。

获取到从node返回的结果之后。由listener通过channel返回给调用方。

总结

client端的工作大体就是这么些了,下一遍再来说说在server端的工作了,server端的会比较麻烦一点,查询还会分query、fetch上面的,下一篇再见咯。

 

转载请注明出处:http://www.opscoder.info/es_search_client.html
















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/7232886.html,如需转载请自行联系原作者

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
存储 SQL JSON
Elasticsearch Search API之搜索模板(search Template)
Elasticsearch Search API之搜索模板(search Template)
Elasticsearch Search API之搜索模板(search Template)
|
2月前
|
网络协议 Java Maven
多模块项目使用ElasticSearch报错
多模块项目使用ElasticSearch报错
39 6
|
6月前
|
NoSQL Java API
SpringBoot【ElasticSearch集成 02】Java HTTP Rest client for ElasticSearch Jest 客户端集成(依赖+配置+增删改查测试源码)推荐使用
SpringBoot【ElasticSearch集成 02】Java HTTP Rest client for ElasticSearch Jest 客户端集成(依赖+配置+增删改查测试源码)推荐使用
111 0
|
Java API 数据安全/隐私保护
Elasticsearch Java API Client 开发
本场景主要介绍如何使用 Elasticsearch Java API Client 进行开发,实现常用的 CRUD 操作。
Elasticsearch Search APIs2
Elasticsearch Search APIs
77 0
   Elasticsearch Search APIs2
|
算法
白话Elasticsearch14-深度探秘搜索技术之基于multi_match 使用most_fields策略进行cross-fields search弊端
白话Elasticsearch14-深度探秘搜索技术之基于multi_match 使用most_fields策略进行cross-fields search弊端
97 0
Elasticsearch Search APIs3
Elasticsearch Search APIs3
62 0
|
关系型数据库 MySQL 测试技术
Elasticsearch Search APIs1
Elasticsearch Search APIs
90 0
|
关系型数据库 MySQL 开发工具
Python:使用 mysqlsmom 模块实时同步MySQL数据到ElasticSearch
Python:使用 mysqlsmom 模块实时同步MySQL数据到ElasticSearch
154 0
|
存储 Java API
Elasticsearch Search API之(Request Body Search 查询主体)-下篇
Elasticsearch Search API之(Request Body Search 查询主体)-下篇
Elasticsearch Search API之(Request Body Search 查询主体)-下篇