<properties> <java.version>1.8</java.version> <elasticsearch.version>7.12.1</elasticsearch.version> </properties> <dependencies> <!--elasticsearch依赖包--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.12.1</version> </dependency> </dependencies>
查询的基本步骤是:
1.
创建
SearchRequest
对象
2.
准备
Request.source()
,也就是
DSL
。
①
QueryBuilders
来构建查询条件
②
传入
Request.source()
的
query()
方法
3.
发送请求,得到结果
4.
解析结果(参考
JSON
结果,从外到内,逐层解析)
@Test
void testMatchAllHotelIndex() throws IOException {
// 1.创建Request对象
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().query(QueryBuilders.matchAllQuery());
// 3.发起请求
testFindHotelIndex(request);
}
@Test
void tesMatchHotelIndex() throws IOException {
// 1.创建Request对象
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().query(QueryBuilders.matchQuery("all","如家"));
// 3.发起请求
testFindHotelIndex(request);
}
/**
* @description ES通用数据查询
* @param request:
*/
public void testFindHotelIndex(SearchRequest request) throws IOException {
// 3.发起请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//System.out.println(response);
//4.解析结果
SearchHits hits = response.getHits();
//4.1查询总条数
long value = hits.getTotalHits().value;
System.out.println("es搜索到:" + value + "条数据");
//4.2查询的结果数组
SearchHit[] hitsHits = hits.getHits();
for (SearchHit e : hitsHits) {
//4.3 得到source
String json = e.getSourceAsString();
//4.4 打印
System.out.println("json = " + json);
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
System.out.println("hotelDoc = " + hotelDoc.toString());
}
}
其它查询变化不大
private RestHighLevelClient client;
@BeforeEach
void setUp() {
this.client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://192.168.2.199:9200")
));
}
@AfterEach
void tearDown() throws IOException {
this.client.close();
}
@Test
void testClient() {
System.out.println(client);
}
/**
* @description matchAll 查询所有
*/
@Test
void testMatchAllHotelIndex() throws IOException {
// 1.创建Request对象
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().query(QueryBuilders.matchAllQuery());
// 3.发起请求
testFindHotelIndex(request);
}
/**
* @description multiMatch多字段查询
*/
@Test
void testMultiMatchHotelIndex() throws IOException {
// 1.创建Request对象
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().query(QueryBuilders.multiMatchQuery("如家","name","business","brand"));
// 3.发起请求
testFindHotelIndex(request);
}
/**
* @description match 单字段查询
*/
@Test
void tesMatchHotelIndex() throws IOException {
// 1.创建Request对象
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().query(QueryBuilders.matchQuery("all","如家"));
// 3.发起请求
testFindHotelIndex(request);
}
/**
* @description 精确查询常见的有term查询和range查询,同样利用QueryBuilders实现
* term 词条查询
* range 范围查询
*/
@Test
void testTermHotelIndex() throws IOException {
// 1.创建Request对象
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().query(QueryBuilders.termQuery("city","上海"));
// 3.发起请求
testFindHotelIndex(request);
}
/**
* @description 精确查询常见的有term查询和range查询,同样利用QueryBuilders实现
* term 词条查询
* range 范围查询
*/
@Test
void testRangeHotelIndex() throws IOException {
// 1.创建Request对象
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().query(QueryBuilders.rangeQuery("price").gte(100).lte(500));
// 3.发起请求
testFindHotelIndex(request);
}
/**
* @description DSL查询语法-bool查询 复合查询
*/
@Test
void testBoolHotelIndex() throws IOException {
// 1.创建Request对象
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
// 2.1创建布尔查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//2.2 添加must条件 2.3添加filter条件
boolQuery.must(QueryBuilders.termQuery("city", "上海"))
.filter(QueryBuilders.rangeQuery("price").lte(600));
//boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
request.source().query(boolQuery);
// 3.发起请求
testFindHotelIndex(request);
}
/**
* @description Sort size from分页查询
*/
@Test
void testSortHotelIndex() throws IOException {
int page = 1,size = 5;
// 1.创建Request对象
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().query(QueryBuilders.matchAllQuery())
.sort("price", SortOrder.ASC).from((page-1)*size).size(size);
// 3.发起请求
testFindHotelIndex(request);
}
/**
* @description 高亮显示
* term 词条查询
* range 范围查询
*/
@Test
void testHighLightHotelIndex() throws IOException {
// 1.创建Request对象
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
request.source().query(QueryBuilders.termQuery("city","上海"));
//2.2 高亮查询
request.source().highlighter(new HighlightBuilder().field("name").
requireFieldMatch(false));
// 3.发起请求
testFindHotelIndex(request);
}
/**
* @description ES通用数据查询
* @param request:
*/
public void testFindHotelIndex(SearchRequest request) throws IOException {
// 3.发起请求
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//System.out.println(response);
//4.解析结果
SearchHits hits = response.getHits();
//4.1查询总条数
long value = hits.getTotalHits().value;
System.out.println("es搜索到:" + value + "条数据");
//4.2查询的结果数组
SearchHit[] hitsHits = hits.getHits();
for (SearchHit e : hitsHits) {
//4.3 得到source
String json = e.getSourceAsString();
//4.4 打印
//System.out.println("json = " + json);
//反序列化
HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
//获取高亮结果
Map<String, HighlightField> highlightFields = e.getHighlightFields();
if(!CollectionUtils.isEmpty(highlightFields)){
//根据字段名获取高亮结果
HighlightField highlightField = highlightFields.get("name");
if (highlightField != null) {
//获取高亮值
String name = highlightField.getFragments()[0].string();
//覆盖高亮结果
hotelDoc.setName(name);
}
}
System.out.println("hotelDoc = " + hotelDoc.toString());
}
}
算法控制实现(广告排名靠前)
//2.算法控制
FunctionScoreQueryBuilder functionScoreQueryBuilder =
QueryBuilders.functionScoreQuery(
//原始数据查询,相关性算分的查询
boolQueryBuilder, new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
//其中一个function score 元素
new FunctionScoreQueryBuilder.FilterFunctionBuilder(
//过滤条件
QueryBuilders.termQuery("isAD", true),
//算分函数
ScoreFunctionBuilders.weightFactorFunction(10)
)
});
request.source().query(functionScoreQueryBuilder);