根据我的另一篇文章对照看。elasticsearch进阶查询
查询代码如下
@SpringBootTest
public class QueryTest {
@Autowired
RestHighLevelClient restHighLevelClient;
private String indexName = "bank";
/**
* 全查 按照年龄降序排序 分页 =>limit 0,5
*/
@Test
public void query1() throws IOException {
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
searchSourceBuilder.query(matchAllQueryBuilder);
searchSourceBuilder.sort("balance", SortOrder.DESC);
searchSourceBuilder.from(0);
searchSourceBuilder.size(5);
searchRequest.source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
SearchHit[] data = hits.getHits();
if (ArrayUtils.isNotEmpty(data)) {
for (SearchHit dataItem : data) {
String sourceAsString = dataItem.getSourceAsString();
BankAccountVo bankAccountVo = JSONUtils.toBean(sourceAsString, BankAccountVo .class);
System.out.println(bankAccountVo.getFirstName()+"====="+bankAccountVo.getAddress());
}
}
}
/**
* 查询地址为 地址含有mill 的记录
*/
@Test
public void query2() throws IOException {
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address","mill");
searchSourceBuilder.query(matchQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
System.out.println("结果:"+search.status());
SearchHits hits = search.getHits();
for (SearchHit hit : hits.getHits()) {
BankAccountVo bankAccountVo = JSONUtils.toBean(hit.getSourceAsString(), BankAccountVo.class);
System.out.println(bankAccountVo.getFirstName()+"-----"+bankAccountVo.getAddress());
}
}
/**
* 查看部分字段
* @throws IOException
*/
@Test
public void query3() throws IOException {
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query( QueryBuilders.matchAllQuery());
searchSourceBuilder.fetchSource(new String[]{"balance"},null);
searchRequest.source(searchSourceBuilder);
System.out.println("构建结果:"+searchSourceBuilder.toString());
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
for (SearchHit hit : hits.getHits()) {
BankAccountVo bankAccountVo = JSONUtils.toBean(hit.getSourceAsString(), BankAccountVo.class);
System.out.println(bankAccountVo.getFirstName()+"-----"+bankAccountVo.getAddress());
}
}
/**
*multi_match 多字段查询 指定字段中出现了目标文本都行
* @throws IOException
*/
@Test
public void query4() throws IOException {
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//变换的是这部分==start
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("mill","address","email","city");
searchSourceBuilder.query(multiMatchQueryBuilder);
//变换的是这部分==end
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits.getHits()) {
BankAccountVo bankAccountVo = JSONUtils.toBean(hit.getSourceAsString(), BankAccountVo.class);
System.out.println(bankAccountVo.getAddress()+"-----"+bankAccountVo.getEmail()+"-----"+bankAccountVo.getCity());
}
}
/**
* bool 查询 复合查询 性别必须是女,地址包含mill,年龄不等于38
* @throws IOException
*/
@Test
public void query5() throws IOException {
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//变换的是这部分==start
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("gender", "M");
boolQueryBuilder.must(matchQueryBuilder);
MatchQueryBuilder ageQueryBuilder = QueryBuilders.matchQuery("age", 38);
boolQueryBuilder.mustNot(ageQueryBuilder);
//变换的是这部分==end
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits.getHits()) {
BankAccountVo bankAccountVo = JSONUtils.toBean(hit.getSourceAsString(), BankAccountVo.class);
System.out.println(bankAccountVo.getAddress()+"-----"+bankAccountVo.getEmail()+"-----"+bankAccountVo.getCity()+bankAccountVo.getAge());
}
}
/**
* #should 应该可能的意思。顾名思义,满足的话最好,不满足也没事
*/
@Test
public void query6() throws IOException {
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//变换的是这部分==start
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("gender", "M");
boolQueryBuilder.must(matchQueryBuilder);
MatchQueryBuilder ageQueryBuilder = QueryBuilders.matchQuery("age", 38);
boolQueryBuilder.mustNot(ageQueryBuilder);
MatchQueryBuilder shouldBuilder = QueryBuilders.matchQuery("city", "Blackgum");
boolQueryBuilder.should(shouldBuilder);
//变换的是这部分==end
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits.getHits()) {
BankAccountVo bankAccountVo = JSONUtils.toBean(hit.getSourceAsString(), BankAccountVo.class);
System.out.println(bankAccountVo.getAddress()+"-----"+bankAccountVo.getEmail()+"-----"+bankAccountVo.getCity()+bankAccountVo.getAge());
}
}
/**
* filter 用法与must 级别一致, 区别在于 filter没有参与评分
*/
@Test
public void query7() throws IOException {
SearchRequest searchRequest = new SearchRequest(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//变换的是这部分==start
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("gender", "M");
boolQueryBuilder.filter(matchQueryBuilder);
MatchQueryBuilder ageQueryBuilder = QueryBuilders.matchQuery("age", 38);
//mustNot 本身也是一个过滤器
boolQueryBuilder.mustNot(ageQueryBuilder);
MatchQueryBuilder shouldBuilder = QueryBuilders.matchQuery("city", "Blackgum");
boolQueryBuilder.should(shouldBuilder);
//变换的是这部分==end
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits.getHits()) {
BankAccountVo bankAccountVo = JSONUtils.toBean(hit.getSourceAsString(), BankAccountVo.class);
System.out.println(bankAccountVo.getAddress()+"-----"+bankAccountVo.getEmail()+"-----"+bankAccountVo.getCity()+bankAccountVo.getAge());
}
}
}