【自学elasticsearch7】结合es语法和java的HighLevelClient:查询时es的curl操作命令和client构造对照
)
能否用java代码构建出复杂的es查询语句理解es的curl查询命令与HighLevelClient的关系至关重要!!!
用一个例子来对照这两者的关系,es的curl操作命令可以分为两部分:一是http请求头部分,二是请求体部分
GET /firstmapping/_search
{
"query": {
"match": {
"content": "华强"
}
},
"from": 0,
"size": 5,
"sort": [
{
"score": {
"order": "desc"
}
}
],
"track_total_hits": true,
"highlight": {
"fields": {
"title": {}
}
}
}
查询命令的请求头组成:GET + 索引名 + _search
请求体:列举了以上几个比较常用的
- query :查询条件构建
- from 和 size 用来进行分页查询(当不填写size参数时,默认只查出10条)
- sort:构建排序
- track_total_hits :是否开启全部查询(若不开启当文档总数超过10000时,查询结果返回的总条数为10000)
- highlight:高亮查询
而在用HighLevelClient构建查询时则需要分为三部分:
第一步,构建请求(即对应curl的请求头部分):常用的类包括 org.elasticsearch.action.search.SearchRequest、org.elasticsearch.client.indices.GetIndexRequest等
第二步,构建查询参数(对应curl的from、size、sort、highlight等参数配置):用到的类是org.elasticsearch.search.builder.SearchSourceBuilder
第三步,构建查询请求(对应curl的query部分),主要类为QueryBuilders,可以构建各种查询,包括BoolQuery、MatchQuery、TermQuery等,构建完成后填入第二步的SearchSourceBuilder中searchSourceBuilder.query(builder);
了解了这三个步骤,就可以对应的将开头的curl命令用java代码表示出来:
public void searchTest(){
SearchRequest searchRequest = new SearchRequest("firstmapping");//构建请求头
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//构建请求体
MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("content", "华强"); //构建查询参数
HighlightBuilder highlightBuilder = new HighlightBuilder(); //构建高亮显示
highlightBuilder.field("content");
searchSourceBuilder.query(queryBuilder);//将查询条件赋给请求体
searchSourceBuilder.trackTotalHits(true);
searchSourceBuilder.from(0);
searchSourceBuilder.size(5);
searchSourceBuilder.sort("score",SortOrder.DESC);
searchSourceBuilder.highlighter(highlightBuilder); //将高亮显示赋给请求体
searchRequest.source(searchSourceBuilder);//将请求体赋给请求头
SearchResponse searchResponse = null;
try{
searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
}catch (Exception e){
e.printStackTrace();
}
/*
* 接下来即可从searchResponse中获取查询结果
*/
SearchHit[] hits = searchResponse.getHits().getHits();
for (SearchHit hit : hits) {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
System.out.println(sourceAsMap);
}
}