拓冰建站拓冰建站
首页 / 资讯中心 / 正文

es search包

好问题有了 index 包的底子看 search 包会顺畅很多。---search 包的入口SearchService跟 index 包一样SearchService 是 search 包的门面所有搜索请求都会先经过它。java// 搜索服务每个节点都有一个public class SearchService {// 执行搜索public SearchPhaseResult executeQueryPhase(...)// 执行获取取回 _sourcepublic SearchPhaseResult executeFetchPhase(...)// 执行聚合public SearchPhaseResult executeAggregationPhase(...)}从 SearchService 开始你会看到这个流程SearchService.executeQueryPhase()↓创建 Context搜索上下文↓IndexSearcherLucene 搜索器↓Query 构建↓执行搜索↓返回结果---主线路径跟着一个搜索请求走【协调节点】TransportSearchAction↓ 广播到所有分片【数据节点】SearchService.executeQueryPhase()↓ 创建搜索上下文SearchContext↓ 构建 Lucene QueryQueryBuilder → Lucene Query↓ 执行搜索IndexSearcher.search(query)↓ 返回结果SearchPhaseResult↓ 返回给协调节点【协调节点】SearchPhaseController.merge()↓ 合并排序/分页/聚合返回给用户---核心类一览1. SearchService入口门面每个节点上的搜索服务所有搜索请求的入口。2. SearchContext搜索上下文一次搜索的上下文包含查询、排序、聚合等所有信息。3. QueryPhase查询阶段执行 Lucene 搜索返回文档 ID 评分。4. FetchPhase取回阶段根据文档 ID去 Lucene 取回 _source 等字段。5. AggregationPhase聚合阶段执行桶聚合、指标聚合等。6. SearchPhaseController协调控制器协调节点上负责合并所有分片的结果。---建议的阅读顺序第 1 步SearchService→ 找 executeQueryPhase 方法→ 看它怎么创建 SearchContext第 2 步SearchContext→ 看它里面装了什么Query、Sort、Aggregations第 3 步QueryPhase→ 看它怎么把 QueryBuilder 转成 Lucene Query→ 看它怎么调用 IndexSearcher.search()第 4 步FetchPhase→ 看它怎么根据文档 ID 取回 _source第 5 步SearchPhaseController→ 看它怎么合并多个分片的结果---一个具体的代码追踪路线java// 1. SearchService 入口public SearchPhaseResult executeQueryPhase(SearchShardRequest request) {// 创建搜索上下文SearchContext context createContext(request);// 执行查询return queryPhase.execute(context);}// 2. QueryPhasepublic SearchPhaseResult execute(SearchContext context) {// 构建 Lucene QueryQuery luceneQuery context.query().toQuery(context);// 执行搜索IndexSearcher searcher context.searcher();TopDocs topDocs searcher.search(luceneQuery, context.size());// 返回结果return new SearchPhaseResult(topDocs);}// 3. SearchPhaseController协调节点public void merge(ListSearchPhaseResult results) {// 合并所有分片的结果// 排序、分页、聚合for (SearchPhaseResult result : results) {merged.add(result);}return merged.sort().paginate();}---为什么先看 index 包再看 search 包会更顺index 包 search 包你知道 Lucene 怎么写 你看 Lucene 怎么读你知道 IndexWriter 是什么 你知道 IndexSearcher 是什么你知道 Document 是什么 你知道 TopDocs 是什么你知道 Segment 是什么 你知道 Term 查询怎么工作search 包的 QueryPhase 本质上就是在1. 把用户查询转成 Lucene Query2. 调用 IndexSearcher.search()3. 把 Lucene TopDocs 包装成 ES 结果你看过 Lucene这个过程你早就懂了只是看 ES 怎么封装而已。---总结问题 答案从哪里开始 SearchService核心类有哪些 SearchService, SearchContext, QueryPhase, FetchPhase, SearchPhaseController主线路径 SearchService → SearchContext → IndexSearcher → 返回 → 合并和 index 包的关系 读依赖于写所以先看 index 包你的优势在哪 懂 Lucene知道 IndexSearcher 怎么工作一句话从 SearchService 开始顺着 SearchService.executeQueryPhase() → QueryPhase → IndexSearcher.search() 这条线走到底。 你很快就能把整个搜索链路串起来。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门