Elasticsearch02(分布式搜索、数据聚合)

发布时间:2026/5/20 9:19:58

Elasticsearch02(分布式搜索、数据聚合) 文章目录day09-Elasticsearch02 学习总结一、DSL查询1. 查询分类2. 叶子查询2.1 全文检索查询2.2 精确查询3. 复合查询3.1 bool查询布尔查询3.2 function_score查询算分函数4. 排序5. 分页5.1 基础分页5.2 深度分页问题6. 高亮二、RestClient查询1. 查询基本步骤2. 核心API3. 响应解析流程4. 各种查询实现5. 排序和分页6. 高亮三、数据聚合1. 聚合分类2. DSL聚合语法2.1 Bucket聚合terms2.2 带条件聚合2.3 Metric聚合stats3. RestClient实现聚合四、今日核心知识点Elasticsearch02 校招面试常问问题总结一、查询类1. match和term的区别2. 全文检索查询有哪些3. range查询怎么用4. bool查询的must、filter、should、must_not区别5. 为什么filter比must性能好6. function_score有什么用二、排序和分页类7. ES默认怎么排序8. 怎么自定义排序9. 什么字段可以排序10. 深度分页有什么问题怎么解决三、高亮类11. 高亮显示的原理12. 高亮需要什么条件四、聚合类13. 聚合有哪些类型14. 怎么统计每个品牌的商品数量15. 带条件的聚合怎么做16. 怎么计算每个品牌的平均价格五、项目实践类17. 你们项目搜索功能怎么实现的18. 搜索页面的过滤条件怎么动态生成19. 广告商品怎么置顶20. 数据库和ES数据怎么同步六、常见坑点21. term查不到数据22. text字段无法聚合/排序23. 高亮不生效24. 深度分页报错七、校招ES考察重点排序进阶篇day09-Elasticsearch02 学习总结一、DSL查询1. 查询分类类型说明示例叶子查询在特定字段查询特定值match、term、range复合查询组合多个叶子查询bool、function_score2. 叶子查询2.1 全文检索查询match对搜索条件分词在指定字段搜索multi_match对搜索条件分词在多个字段搜索2.2 精确查询term不对搜索条件分词精确匹配适用于keyword、数值、日期range范围查询gt、gte、lt、lteids根据id查询3. 复合查询3.1 bool查询布尔查询逻辑运算作用是否参与算分must必须匹配与是should选择性匹配或是must_not必须不匹配非否filter必须匹配过滤否最佳实践与搜索无关的条件用filter或must_not提高性能3.2 function_score查询算分函数作用人为控制相关性算分如竞价排名组成原始查询过滤条件算分函数weight、field_value_factor等运算模式multiply、replace、sum等4. 排序默认按相关性算分_score排序可自定义排序字段必须是keyword、数值、日期类型5. 分页5.1 基础分页from从第几条开始size每页大小限制fromsize不能超过100005.2 深度分页问题分页越深需要汇总的数据越多性能越差解决方案search after推荐、scroll不推荐6. 高亮原理服务端给搜索关键字加HTML标签前端定义样式要求必须有全文检索查询条件如match高亮字段必须是text类型二、RestClient查询1. 查询基本步骤创建SearchRequest对象指定索引库通过request.source()构建DSL使用QueryBuilders构建查询条件调用client.search()发送请求解析响应结果2. 核心API组件作用SearchRequest查询请求对象request.source()构建DSLquery、sort、from、size、highlight等QueryBuilders构建各种查询条件SearchResponse查询响应结果3. 响应解析流程SearchResponse→getHits()→SearchHits├──getTotalHits().value → 总条数 └──getHits()→SearchHit[]文档数组 └──getSourceAsString()→ 原始JSON文档 └──getHighlightFields()→ 高亮结果4. 各种查询实现查询类型JavaAPI对应方法match_allQueryBuilders.matchAllQuery()matchQueryBuilders.matchQuery()multi_matchQueryBuilders.multiMatchQuery()termQueryBuilders.termQuery()rangeQueryBuilders.rangeQuery()boolQueryBuilders.boolQuery()function_scoreQueryBuilders.functionScoreQuery()5. 排序和分页request.source().sort(字段,SortOrder.ASC);request.source().from((pageNo-1)*pageSize).size(pageSize);6. 高亮request.source().highlighter(SearchSourceBuilder.highlight().field(字段).preTags(em).postTags(/em));三、数据聚合1. 聚合分类类型作用示例Bucket聚合分组统计按品牌分组、按分类分组Metric聚合计算指标平均值、最大值、最小值Pipeline聚合基于其他聚合结果计算略2. DSL聚合语法2.1 Bucket聚合terms{size:0,aggs:{聚合名称:{terms:{field:分组字段,size:返回结果数}}}}2.2 带条件聚合query条件限定聚合的文档范围先query过滤再aggs聚合2.3 Metric聚合stats在bucket聚合内部添加子聚合对每个桶内的文档做统计min、max、avg、sum等3. RestClient实现聚合创建聚合AggregationBuilders.terms().field()添加聚合request.source().aggregation()获取聚合response.getAggregations().get()解析桶Terms.getBuckets()四、今日核心知识点模块技术点作用查询match/term全文检索 vs 精确查询查询bool组合多个查询条件查询function_score竞价排名、人工干预算分分页from/size基础分页高亮highlight搜索关键字高亮显示聚合bucket分组统计品牌、分类聚合metric指标计算平均值等Elasticsearch02 校招面试常问问题总结一、查询类1. match和term的区别问match查询和term查询有什么区别答match对搜索条件分词用于text字段全文检索term不分词用于keyword、数值等精确匹配2. 全文检索查询有哪些问ES中怎么做全文检索答用match或multi_match会对输入内容分词在倒排索引中搜索3. range查询怎么用问怎么实现价格范围筛选答用range查询指定gt/gte/lt/lte4. bool查询的must、filter、should、must_not区别问bool查询中几种逻辑运算有什么区别答must必须满足参与算分filter必须满足不参与算分性能好should选择性满足影响算分must_not必须不满足不参与算分5. 为什么filter比must性能好问filter为什么不参与算分有什么好处答不参与算分可以省略相关性计算性能更好适合过滤条件6. function_score有什么用问怎么实现竞价排名广告商品靠前答用function_score查询对符合条件的文档通过weight等函数提高算分二、排序和分页类7. ES默认怎么排序问ES查询结果默认按什么排序答默认按相关性算分_score降序排序8. 怎么自定义排序问如何按价格从低到高排序答添加sort条件指定字段和排序方式9. 什么字段可以排序问text类型能排序吗答不能排序字段必须是keyword、数值、日期类型10. 深度分页有什么问题怎么解决问ES查询第1000页数据有什么问题答需要从每个分片拉取大量数据内存消耗大性能差。默认限制fromsize≤10000深度分页用search after三、高亮类11. 高亮显示的原理问搜索结果中的关键字高亮是怎么实现的答ES给匹配到的词条加HTML标签如前端定义样式12. 高亮需要什么条件问实现高亮查询有什么要求答必须有全文检索查询条件高亮字段必须是text类型四、聚合类13. 聚合有哪些类型问ES的聚合分几类各有什么作用答Bucket分组、Metric计算指标、Pipeline基于聚合再计算14. 怎么统计每个品牌的商品数量问如何实现类似SQL的group by答用terms聚合按brand字段分组15. 带条件的聚合怎么做问只统计价格3000的手机品牌怎么实现答先query过滤再aggs聚合16. 怎么计算每个品牌的平均价格问分组后怎么计算每组的平均值答在bucket聚合内嵌套metric聚合如stats或avg五、项目实践类17. 你们项目搜索功能怎么实现的问讲讲你们项目的商品搜索答使用ES支持关键字搜索、分类/品牌过滤、价格范围、排序、分页、高亮18. 搜索页面的过滤条件怎么动态生成问搜索“手机”时分类和品牌过滤项怎么来的答对搜索结果做terms聚合统计出现的分类和品牌19. 广告商品怎么置顶问付费推广的商品怎么排在前面答用function_score查询isADtrue的商品提高算分权重20. 数据库和ES数据怎么同步问商品数据变了ES怎么更新答用MQ异步通知商品服务发送消息搜索服务监听更新六、常见坑点21. term查不到数据注意检查字段类型是否为keywordterm不分词必须完全匹配22. text字段无法聚合/排序注意聚合和排序的字段必须是keyword、数值、日期类型23. 高亮不生效注意必须有全文检索查询条件高亮字段必须是text且与搜索字段一致或设置required_field_matchfalse24. 深度分页报错注意fromsize超过10000会报错考虑用search after或限制分页深度七、校招ES考察重点排序进阶篇match vs term区别⭐⭐⭐⭐⭐bool查询各条件作用⭐⭐⭐⭐⭐filter vs must性能差异⭐⭐⭐⭐function_score实现竞价排名⭐⭐⭐⭐聚合bucketmetric⭐⭐⭐⭐高亮实现原理⭐⭐⭐深度分页问题及解决⭐⭐⭐总结校招面试ES进阶核心考察查询类型的选择、复合查询的使用、聚合统计的实现。你能把今天学的match和term怎么选分词 vs 不分词bool查询怎么组合条件must/filter/should怎么实现广告置顶function_score怎么动态生成过滤项聚合讲清楚逻辑再结合商品搜索的案例完全足够

相关新闻