ElasticSearch DSL语言高级查询+SpringBoot
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相关推荐
- ElasticSearch语法整理-DSL语言高级查询
Domain Specific Language 领域专用语言 DSL由叶子查询子句和复合查询子句两种子句组成. 无查询条件 无查询条件是查询所有,默认是查询所有的索引库的数据,或者使用match_a ...
- 微服务项目之电商--19.ElasticSearch基本、高级查询和 过滤、结果过滤、 排序和聚合aggregations
接上一篇 目录 3.查询 3.1.基本查询: 3.1.1 查询所有(match_all) 3.1.2 匹配查询(match) 3.1.3 多字段查询(multi_match) 3.1.4 词条匹配(t ...
- 跟乐乐学ES!(三)ElasticSearch 批量操作与高级查询
上一篇文章:跟乐乐学ES!(二)ElasticSearch基础. 下一篇文章:跟乐乐学ES!(四) java中ElasticSearch客户端的使用. 批量操作 有些增删改查操作是可以进行批量操作的, ...
- Elasticsearch(二、高级查询+集群搭建)
1内容概述 ElasticSearch 高级操作 ElasticSearch 集群管理 2 ElasticSearch高级操作 2.1 bulk批量操作-脚本 脚本: 测试用的5号文档 POST /p ...
- 【纯干货】SpringBoot 整合 ES 进行各种高级查询搜索
在上篇 SpringBoot 整合 ElasticSearch 文章中,我们详细的介绍了 ElasticSearch 的索引和文档的基本增删改查的操作方法! 本文将重点介绍 ES 的各种高级查询写法和 ...
- SpringBoot整合ES高级查询
SpringBoot整合ES高级查询 springboot版本:2.0.5.RELEASE elasticsearch版本:7.9.1 1.配置 引入依赖: <dependency>< ...
- Day121.ElasticSearch:概述、安装、基本操作、DSL高级查询
目录 一.ElasticSearch概述 2.倒排索引 3.ElasticSearch 核心概念 ★ (一) ElasticSearch | 相关工具安装 (Windows) 2.kibana7.8 ...
- Elasticsearch高级查询Query DSL
一.高级查询Query DSL简介 1.Query DSL(简介 Elasticsearch中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL(Domain Specified La ...
- Elasticsearch高级查询2:ES 高级查询
一.高级查询 1.简介 Elasticsearch基于JSON提供完整的查询DSL(Domain Specific Language:领域特定语言)来定义查询. 基本语法: GET /索引名/类型名/ ...
最新文章
- ECCV 2020 Oral | 可逆图像缩放:完美恢复降采样后的高清图片
- 树莓派应用实例5:测量土壤湿度
- 40款用于简洁网页设计的光滑英文字体【下】
- 在 JQuery Mobile 中实现瀑布流图库布局
- C#并行编程(5):需要知道的异步
- Linux实验一:常用的Linux命令
- ASP.NET Core 3.0 发布
- ubuntu下mysql整个数据库备份与还原
- u盘不显示盘符但能识别怎么回事
- Copy-and-swap
- Android 网络代理的创建
- Linux小知识--通过MAC地址查询厂家OUI(成功率很高)
- 通州区机器人比赛活动总结_机器人科技活动总结.doc
- 【转载】通过搜狗站长平台提交网站域名变更后的文章地址
- java软件更换皮肤怎么做_java窗体程序更换皮肤方法详细步骤
- 《科学》:基因编辑婴儿入选年度“科学崩坏”事件
- 谈谈 2020 年程序员收入报告
- 《禅与摩托车维修艺术》读后感
- (JavaSE 学习记录) 多线程之两种常用实现方式
- HBuilder开发小程序,如何实现在微信开发者工具中实时更新