ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

es笔记,总结记录

es笔记,总结记录 查询一、客户端选型简单场景Spring Data Elasticsearch分为ElasticsearchRepository、RestHighLevelClient、ElasticsearchOperations。ElasticsearchRepository接口通过方法名自动生成查询零手写 DSL 就能完成 CRUD、基础分页、关键词检索开发效率拉满。RestHighLevelClient遗留系统维护Spring Boot 2.x ES 7.xSpring Boot 3 要求构建和运行环境都是 JDK 17。ElasticsearchOperations要求 Spring Boot 3SDE 标准做法平衡了易用性和性能支持对象映射。复杂场景Elasticsearch Java API Client原生 ElasticsearchClient。直接注入 Spring 自动装配好的原生 ElasticsearchClient可以直接调用 ES 所有原生 API支持自定义复杂聚合、脚本排序、BulkIngester 高性能批量写入等高级操作没有封装层的能力阉割性能和直接调用原生客户端完全一致。二、查询语法1. 查询关键词所在上下文query-bool 下must下match、match_phrase、multi_matchfilter下term、terms、range、existsshould下同mustmust_not下同filter2. 各子句语义must必须匹配会打分AND Score。filter必须匹配不打分AND No Score Cachable。should可选匹配加分项OR Score。must_not必须不匹配不打分NOT No Score Cachable。bool逻辑容器组合以上。3. 形象化理解must should“会打分的裁判”。它们根据查询词在文档中的匹配程度如出现频率、字段权重等给出一个相关性分数_score最终文档按此分数排序。filter must_not“不记分的筛选器”。它们只做是/否的二元判断匹配/不匹配不产生任何分数。ES 会自动缓存这些查询结果因此速度更快适合频繁执行的过滤条件。must filter像漏斗不断缩小结果集。should像加分项不改变结果集但改变排序。must_not像筛子从结果中剔除特定文档。4. 完整示例GET /products/_search { query: { bool: { // 1. 全文搜索部分参与评分决定排序 must: [ { multi_match: { query: 华为 智能手机 5G, fields: [ name^3, // 名称字段权重为3 description^2, // 描述字段权重为2 tags // 标签字段权重为1 ], type: best_fields // 取最高分字段的分数 } } ], // 2. 精确过滤部分不参与评分可缓存性能高 filter: [ { term: { status: active } }, // 只显示在售商品 { range: { price: { gte: 1000, lte: 5000 } } }, // 价格范围 { terms: { brand: [huawei, honor] } } // 品牌是华为或荣耀 ], // 3. 排除部分不参与评分可缓存 must_not: [ { term: { category: refurbished } }, // 排除翻新机 { term: { seller_rating: low } } // 排除低评级卖家 ], // 4. 可选加权部分参与评分提升特定商品的排名 should: [ { term: { is_premium: true } }, // 优先展示高级商品 { term: { is_free_shipping: true } }, // 优先展示包邮商品 { range: { sales_count: { gte: 1000 } } } // 优先展示销量高的商品 ], // 5. 控制should匹配数量即使没有匹配任何should子句文档也能被返回 minimum_should_match: 0 } }, sort: [ { _score: { order: desc } }, // 首先按相关度评分排序 { sales_count: { order: desc } } // 评分相同时按销量降序 ], from: 0, size: 10 }三、聚合1. 聚合模板aggs: { 聚合名称: { 聚合类型: { 聚合参数: {} } } }聚合名称自定义聚合类型terms聚合参数field: xxx.keyword2. 例子GET /bank/_search { size: 0, aggs: { group_by_state: { terms: { field: state.keyword } } } }
返回列表