DSL查询

This commit is contained in:
bunny 2024-04-01 17:29:09 +08:00
parent 839a976465
commit d0741b4ed7
11 changed files with 352 additions and 8 deletions

19
.idea/dataSources.xml Normal file
View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="tb_hotel@106.15.251.123" uuid="a8eb04e7-59f0-4872-8f1d-fc3b8a19688b">
<driver-ref>mysql</driver-ref>
<synchronize>true</synchronize>
<imported>true</imported>
<remarks>$PROJECT_DIR$/src/main/resources/application.yaml</remarks>
<jdbc-driver>com.mysql.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mysql://106.15.251.123:3305/tb_hotel?useSSL=false</jdbc-url>
<jdbc-additional-properties>
<property name="com.intellij.clouds.kubernetes.db.host.port" />
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
<property name="com.intellij.clouds.kubernetes.db.container.port" />
</jdbc-additional-properties>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

View File

@ -1,19 +1,13 @@
package cn.itcast.hotel; package cn.itcast.hotel;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@MapperScan("cn.itcast.hotel.mapper") @MapperScan("cn.itcast.hotel.mapper")
@SpringBootApplication @SpringBootApplication
public class HotelDemoApplication { public class HotelDemoApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(HotelDemoApplication.class, args); SpringApplication.run(HotelDemoApplication.class, args);
} }
} }

View File

@ -0,0 +1,184 @@
package cn.itcast.hotel;
import org.apache.http.HttpHost;
import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.util.Map;
public class DemoTest {
private RestHighLevelClient client;
/**
* * 因为下面会重复使用输出语句所以就单独抽出来封装了
*
* @param response 查询结果响应体
*/
public static void handelResponse(SearchResponse response) {
// 查询的总数
TotalHits total = response.getHits().getTotalHits();
System.out.println("total===>" + total);
SearchHits searchHits = response.getHits();
// 输出查询结果
searchHits.forEach(hit -> {
// 查询时JSON数据可以使用实体将其转换
String json = hit.getSourceAsString();
System.out.println(json);
// 高亮返回体
Map<String, HighlightField> map = hit.getHighlightFields();
if (map != null) {
System.out.println("-----------------高亮显示---------------");
HighlightField highlightField = map.get("name");
System.out.println("name===>" + highlightField.getName());
System.out.println("fragments===>" + highlightField.getFragments()[0]);
}
});
}
@BeforeEach
void setup() {
this.client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://192.168.3.98:9200"))
);
}
@AfterEach
void teardown() throws IOException {
this.client.close();
}
// 普通查询
@Test
void testMatchAll() throws IOException {
// 指定查询的索引库
SearchRequest request = new SearchRequest("hotel");
// 查询全部内容
request.source().query(QueryBuilders.matchAllQuery());
// 得到查询返回体传入返回体到封装的返回体输出
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handelResponse(response);
}
// match查询-单字段查询
@Test
void testMatch() throws IOException {
// 指定查询的索引库
SearchRequest request = new SearchRequest("hotel");
// 查询内容
request.source().query(QueryBuilders.matchQuery("all", "如家"));
// 得到查询返回体传入返回体到封装的返回体输出
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handelResponse(response);
}
// match查询-多字段查询
@Test
void testMultiMatchQuery() throws IOException {
// 指定查询的索引库
SearchRequest request = new SearchRequest("hotel");
// 查询内容
request.source().query(QueryBuilders.multiMatchQuery("如家", "name", "business"));
// 得到查询返回体传入返回体到封装的返回体输出
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handelResponse(response);
}
// 精确查询
@Test
void termQuery() throws IOException {
// 指定查询的索引库
SearchRequest request = new SearchRequest("hotel");
// 查询内容-精确查找
request.source().query(QueryBuilders.termQuery("city", "深圳"));
// 得到查询返回体传入返回体到封装的返回体输出
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handelResponse(response);
}
// 范围查找
@Test
void testRange() throws IOException {
// 指定查询的索引库
SearchRequest request = new SearchRequest("hotel");
// 查询内容
request.source().query(QueryBuilders.rangeQuery("price").gte(100).lt(150));
// 得到查询返回体传入返回体到封装的返回体输出
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handelResponse(response);
}
// 布尔查询
@Test
void testBoolean() throws IOException {
// 指定查询的索引库
SearchRequest request = new SearchRequest("hotel");
// 查询内容
BoolQueryBuilder query = QueryBuilders.boolQuery();
query.must(QueryBuilders.termQuery("city", "杭州"));
query.filter(QueryBuilders.rangeQuery("price").lt(250));
// 得到查询返回体传入返回体到封装的返回体输出
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handelResponse(response);
}
// 排序分页
@Test
void testFrom() throws IOException {
// 页码每页大小
int page = 1, size = 5;
// 指定查询的索引库
SearchRequest request = new SearchRequest("hotel");
// 查询内容
request.source().query(QueryBuilders.matchAllQuery());
request.source().from((page - 1) * size).size(5);
request.source().sort("price", SortOrder.ASC);
// 得到查询返回体传入返回体到封装的返回体输出
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handelResponse(response);
}
// 高亮
@Test
void testHighLighter() throws IOException {
// 指定查询的索引库
SearchRequest request = new SearchRequest("hotel");
// 查询内容
request.source().query(QueryBuilders.matchQuery("all", "如家"));
request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
// 得到查询返回体传入返回体到封装的返回体输出
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
handelResponse(response);
}
}

View File

@ -33,7 +33,8 @@ public class HotelDocumentTest {
@BeforeEach @BeforeEach
void setup() throws Exception { void setup() throws Exception {
this.client = new RestHighLevelClient(RestClient.builder( this.client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://192.168.1.4:9200")) // HttpHost.create("http://192.168.1.4:9200"))
HttpHost.create("http://192.168.3.98:9200"))
); );
} }

View File

@ -21,7 +21,8 @@ public class HotelIndexTest {
@BeforeEach @BeforeEach
void setup() throws Exception { void setup() throws Exception {
this.client = new RestHighLevelClient(RestClient.builder(( this.client = new RestHighLevelClient(RestClient.builder((
HttpHost.create("http://192.168.1.4:9200")) // HttpHost.create("http://192.168.1.4:9200"))
HttpHost.create("http://192.168.3.98:9200"))
// 集群缓环境下可以配置多个 // 集群缓环境下可以配置多个
// HttpHost.create("http://192.168.1.7:9200") // HttpHost.create("http://192.168.1.7:9200")
)); ));

View File

@ -0,0 +1,145 @@
package cn.itcast.hotel;
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.util.Map;
public class HotelSearchTest {
private RestHighLevelClient client;
@BeforeEach
void setup() {
this.client = new RestHighLevelClient(RestClient.builder(
// HttpHost.create("http://192.168.1.4:9200"))
HttpHost.create("http://192.168.3.98:9200")
));
}
@AfterEach
void teardown() throws Exception {
this.client.close();
}
// 查询文档
@Test
void testMatchAll() throws IOException {
// 1. 准备request
SearchRequest request = new SearchRequest("hotel");
// 2. 准备DSL
request.source().query(QueryBuilders.matchAllQuery());
// 3.发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 解析结果
SearchHits searchHits = response.getHits();
long total = searchHits.getTotalHits().value;
// 总数
System.out.println("total===>" + total);
searchHits.forEach(hit -> {
// 可以将这个转成酒店的对象
String json = hit.getSourceAsString();
System.out.println(json);
});
}
// 根据字段查询
@Test
void testMatch() throws Exception {
// 准备Request
SearchRequest request = new SearchRequest("hotel");
// 准备DSL
request.source().query(QueryBuilders.matchQuery("all", "如家"));
// 发起请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 解析响应
SearchHits searchHits = response.getHits();
// 得到总数
long total = searchHits.getTotalHits().value;
System.out.println("total===>" + total);
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits) {
System.out.println(hit);
}
}
// 根据范围查询
@Test
void testBool() throws Exception {
// 1. 准备request
SearchRequest request = new SearchRequest("hotel");
// 准备DSL
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.termQuery("city", "上海"));
// 添加range
boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
request.source().query(boolQuery);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
// 得到总数
long total = searchHits.getTotalHits().value;
System.out.println("total===>" + total);
searchHits.forEach(hit -> {
// 可以将这个转成酒店的对象
String json = hit.getSourceAsString();
System.out.println(json);
});
}
// 排序查询
@Test
void testPageSort() throws Exception {
SearchRequest request = new SearchRequest("hotel");
request.source().query(QueryBuilders.matchAllQuery());
request.source().sort("price", SortOrder.ASC);
request.source().from(0).size(5);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
SearchHits searchHits = response.getHits();
searchHits.forEach(hit -> {
String json = hit.getSourceAsString();
System.out.println(json);
});
}
// 高亮显示
@Test
void testHighlight() throws Exception {
// 准备request
SearchRequest request = new SearchRequest("hotel");
// 准备DSL
request.source().query(QueryBuilders.matchQuery("all", "如家"));
// 高亮
request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
// 发送请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 解析响应
SearchHits searchHits = response.getHits();
searchHits.forEach(hit -> {
String json = hit.getSourceAsString();
System.out.println(json);
// 得到高亮
Map<String, HighlightField> map = hit.getHighlightFields();
HighlightField highlightField = map.get("name");
System.out.println("name===>" + highlightField.getName());
System.out.println("fragments===>" + highlightField.getFragments()[0]);
});
}
}

Binary file not shown.