1 环境准备

1.1 Es数据准备

https://gitee.com/zhurongsheng/elasticsearch-data/blob/master/es.data

描述: 执行后查看结果。

1.2 SpringBoot 工程

1.2.1 pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>spring-es</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--日志--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency><!--公用包--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.71</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.2</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.6.2</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.6.2</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.0.RELEASE</version></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build></project>

1.2.2 配置文件

package com.rosh.config;import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ElasticsearchConfig {@Value("${es.host}")public String host;@Value("${es.port}")public int port;@Value("${es.scheme}")public String scheme;@Beanpublic RestClientBuilder restClientBuilder() {return RestClient.builder(makeHttpHost());}private HttpHost makeHttpHost() {return new HttpHost(host, port, scheme);}@Beanpublic RestHighLevelClient restHighLevelClient(RestClientBuilder restClientBuilder) {return new RestHighLevelClient(restClientBuilder);}
}

1.2.3 ElasticSearchApplication

package com.rosh;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @Description:* @Author: Rosh* @Date: 2021/4/27 17:09*/
@SpringBootApplication
public class ElasticSearchApplication {public static void main(String[] args) {SpringApplication.run(ElasticSearchApplication.class);}}

2 DSL语言高级查询

简介: Query DSL概述,Domain Specific Language。领域专用语言,Elasticsearch提供了基于JSON的DSL来定义查询。

2.1 match

match:模糊匹配,需要指定字段名,但是输入会进行分词,比如"hello world"会进行拆分为hello和world,然后匹配,如果字段中包含hello或者world,或者都包含的结果都会被查询出来,也就是说match是一个部分匹配的模糊查询。查询条件相对来说比较宽松。

DSL: 查询地址包含King。

GET /bank/_search
{"query": {"match": {"address": "Kings"}}
}

Spring:

@Autowiredprivate RestHighLevelClient restHighLevelClient;@Testpublic void matchTest() throws IOException {//1 searchSourceBuilderSearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.matchQuery("address", "Kings"));//2 searchRequestSearchRequest searchRequest = new SearchRequest("bank");searchRequest.source(sourceBuilder);//3 查找SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hits = response.getHits().getHits();for (SearchHit searchHit : hits) {String str = searchHit.getSourceAsString();log.info(str);}}

2.2 match_phrase 短语匹配

描述: DSL


GET /bank/_search
{"query": {"match_phrase": {"address": "282 Kings Place"}}
}

2.3 multi_match 多字段匹配

描述: 查询address 或 city 里面和mill匹配的。

GET /bank/_search
{"query": {"multi_match": {"query": "mill","fields": ["address","city"]}}
}


描述: JAVA代码。

   @Autowiredprivate RestHighLevelClient restHighLevelClient;@Testpublic void matchTest() throws IOException {//1 searchSourceBuilderSearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.multiMatchQuery("mill", "address", "city"));//2 searchRequestSearchRequest searchRequest = new SearchRequest("bank");searchRequest.source(sourceBuilder);//3 查找SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hits = response.getHits().getHits();for (SearchHit searchHit : hits) {String str = searchHit.getSourceAsString();log.info(str);}}

2.4 bool查询

描述: bool 各条件之间有and,or或not的关系。

(1) must : 各个条件都必须满足,即各条件是and的关系。
(2) should: 各个条件有一个满足即可,即各条件是or的关系。
(3) must_not:不满足所有条件,即各条件是not的关系。
(4) filter:不计算相关度评分,它不计算_score即相关度评分,效率更高。

PS:must/filter/shoud/must_not 等的子条件是通过 term/terms/range/ids/exists/match 等叶子条件为参数的。

描述: 查询年龄18-30岁之间的男性前20条数据。

GET /bank/_search
{"query": {"bool": {"must": [{"term": {"gender.keyword": {"value": "M"}}}],"filter": {"range": {"age": {"gte": 10,"lte": 30}}}}},"size": 20
}

描述: JAVA代码。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ElasticSearchApplication.class)
@Slf4j
public class ElasticSearchTest {@Autowiredprivate RestHighLevelClient restHighLevelClient;@Testpublic void matchTest() throws IOException {//1 searchSourceBuilderSearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//2 创建boolBoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();boolQueryBuilder.must(QueryBuilders.termQuery("gender.keyword", "M"));boolQueryBuilder.filter(QueryBuilders.rangeQuery("age").gte(10).lte(30));sourceBuilder.query(boolQueryBuilder);sourceBuilder.size(20);//3 searchRequestSearchRequest searchRequest = new SearchRequest("bank");searchRequest.source(sourceBuilder);//4 查找SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hits = response.getHits().getHits();for (SearchHit searchHit : hits) {String str = searchHit.getSourceAsString();log.info(str);}}}

2.5 聚合aggregations

2.5.1 简介

聚合框架有助于根据搜索查询提供聚合数据。聚合查询是数据库中重要的功能特性,ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。聚合可以嵌套,由此可以组成复杂的操作(Bucketing聚合可以包含sub-aggregation)。

聚合计算的值可以取字段的值,也可是脚本计算的结果。查询请求体中以aggregations节点的语法定义:

"aggregations" : {                        //也可简写为 aggs"<aggregation_name>" : {      //聚合的名字"<aggregation_type>" : {     //聚合的类型<aggregation_body>      //聚合体:对哪些字段进行聚合}[,"meta" : {  [<meta_data_body>] } ]?                 //元[,"aggregations" : { [<sub_aggregation>]+ } ]?   //在聚合里面在定义子聚合}[,"<aggregation_name_2>" : { ... } ]*                      //聚合的名字
}

2.5.2 demo

描述: 查询年龄在10-30岁之间,女性总balance。

GET /bank/_search
{"query": {"bool": {"must": [{"term": {"gender.keyword": {"value": "M"}}}],"filter": {"range": {"age": {"gte": 10,"lte": 30}}}}},"size": 0,"aggs": {"sumBalance": {"sum": {"field": "balance"}}}}

  @Autowiredprivate RestHighLevelClient restHighLevelClient;@Testpublic void matchTest() throws IOException {//1 searchSourceBuilderSearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//2 创建boolBoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();boolQueryBuilder.must(QueryBuilders.termQuery("gender.keyword", "M"));boolQueryBuilder.filter(QueryBuilders.rangeQuery("age").gte(10).lte(30));//3 聚合SumAggregationBuilder mainAggs = AggregationBuilders.sum("sumBalance").field("balance");sourceBuilder.size(0);sourceBuilder.query(boolQueryBuilder);sourceBuilder.aggregation(mainAggs);//4 searchRequestSearchRequest searchRequest = new SearchRequest("bank");searchRequest.source(sourceBuilder);//5 查找SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);Aggregations aggregations = response.getAggregations();Sum sumBalance = aggregations.get("sumBalance");System.out.println(sumBalance.getValue());}

2.5.3 聚合可以使用RestClient写

DSL: 可以使用filter_path参数过滤不要的返回信息。

@Autowiredprivate RestHighLevelClient restHighLevelClient;@Testpublic void matchTest() throws IOException {//1 searchSourceBuilderSearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//2 创建boolBoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();boolQueryBuilder.must(QueryBuilders.termQuery("gender.keyword", "M"));boolQueryBuilder.filter(QueryBuilders.rangeQuery("age").gte(10).lte(30));//3 聚合SumAggregationBuilder mainAggs = AggregationBuilders.sum("sumBalance").field("balance");sourceBuilder.size(0);sourceBuilder.query(boolQueryBuilder);sourceBuilder.aggregation(mainAggs);//4 searchRequestRequest request = new Request("GET", "/bank/_search");request.addParameter(EsStatConsts.FILTER_PATH, "aggregations");NStringEntity entity = new NStringEntity(sourceBuilder.toString(), ContentType.APPLICATION_JSON);request.setEntity(entity);//5 查询Response response = restHighLevelClient.getLowLevelClient().performRequest(request);String content = EntityUtils.toString(response.getEntity());JSONObject jsonObject = JSON.parseObject(content);Double rs = jsonObject.getJSONObject("aggregations").getJSONObject("sumBalance").getDouble("value");System.out.println(rs);}

ElasticSearch DSL语言高级查询+SpringBoot相关推荐

  1. ElasticSearch语法整理-DSL语言高级查询

    Domain Specific Language 领域专用语言 DSL由叶子查询子句和复合查询子句两种子句组成. 无查询条件 无查询条件是查询所有,默认是查询所有的索引库的数据,或者使用match_a ...

  2. 微服务项目之电商--19.ElasticSearch基本、高级查询和 过滤、结果过滤、 排序和聚合aggregations

    接上一篇 目录 3.查询 3.1.基本查询: 3.1.1 查询所有(match_all) 3.1.2 匹配查询(match) 3.1.3 多字段查询(multi_match) 3.1.4 词条匹配(t ...

  3. 跟乐乐学ES!(三)ElasticSearch 批量操作与高级查询

    上一篇文章:跟乐乐学ES!(二)ElasticSearch基础. 下一篇文章:跟乐乐学ES!(四) java中ElasticSearch客户端的使用. 批量操作 有些增删改查操作是可以进行批量操作的, ...

  4. Elasticsearch(二、高级查询+集群搭建)

    1内容概述 ElasticSearch 高级操作 ElasticSearch 集群管理 2 ElasticSearch高级操作 2.1 bulk批量操作-脚本 脚本: 测试用的5号文档 POST /p ...

  5. 【纯干货】SpringBoot 整合 ES 进行各种高级查询搜索

    在上篇 SpringBoot 整合 ElasticSearch 文章中,我们详细的介绍了 ElasticSearch 的索引和文档的基本增删改查的操作方法! 本文将重点介绍 ES 的各种高级查询写法和 ...

  6. SpringBoot整合ES高级查询

    SpringBoot整合ES高级查询 springboot版本:2.0.5.RELEASE elasticsearch版本:7.9.1 1.配置 引入依赖: <dependency>< ...

  7. Day121.ElasticSearch:概述、安装、基本操作、DSL高级查询

    目录 一.ElasticSearch概述 2.倒排索引 3.ElasticSearch 核心概念 ★ (一) ElasticSearch | 相关工具安装 (Windows) 2.kibana7.8 ...

  8. Elasticsearch高级查询Query DSL

    一.高级查询Query DSL简介 1.Query DSL(简介 Elasticsearch中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL(Domain Specified La ...

  9. Elasticsearch高级查询2:ES 高级查询

    一.高级查询 1.简介 Elasticsearch基于JSON提供完整的查询DSL(Domain Specific Language:领域特定语言)来定义查询. 基本语法: GET /索引名/类型名/ ...

最新文章

  1. ECCV 2020 Oral | 可逆图像缩放:完美恢复降采样后的高清图片
  2. 树莓派应用实例5:测量土壤湿度
  3. 40款用于简洁网页设计的光滑英文字体【下】
  4. 在 JQuery Mobile 中实现瀑布流图库布局
  5. C#并行编程(5):需要知道的异步
  6. Linux实验一:常用的Linux命令
  7. ASP.NET Core 3.0 发布
  8. ubuntu下mysql整个数据库备份与还原
  9. u盘不显示盘符但能识别怎么回事
  10. Copy-and-swap
  11. Android 网络代理的创建
  12. Linux小知识--通过MAC地址查询厂家OUI(成功率很高)
  13. 通州区机器人比赛活动总结_机器人科技活动总结.doc
  14. 【转载】通过搜狗站长平台提交网站域名变更后的文章地址
  15. java软件更换皮肤怎么做_java窗体程序更换皮肤方法详细步骤
  16. 《科学》:基因编辑婴儿入选年度“科学崩坏”事件
  17. 谈谈 2020 年程序员收入报告
  18. 《禅与摩托车维修艺术》读后感
  19. (JavaSE 学习记录) 多线程之两种常用实现方式
  20. HBuilder开发小程序,如何实现在微信开发者工具中实时更新

热门文章

  1. 18.06.27 POJ百练 4124海贼王之伟大航路
  2. win7ie11调用java失败,win7纯净版系统下ie11无法加载java插件
  3. 【HDU】 4833 Best Financing DP
  4. linux vi编辑器删除多行,vim编辑器如何删除一行或者多行内容
  5. 【20210727】图说全球网站数量及服务器市场份额
  6. 前端实现自动打印 批量打印
  7. 文字溢出省略和用户体验优化
  8. EXCEL VB简单使用
  9. vlookup使用步骤_VLOOKUP函数的使用方法(入门级)
  10. 量化对冲基金的国内发展史