ElasticSearch之RestClient查询文档
一、DSL查询语法
DSL Query的分类
Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:
- 查询所有:查询出所有数据,一般测试用。
- 例如:matchall
- 全文检索(fulltext)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:
- match query
- multi match query
- 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:
- ids
- range
- term
- 地理(geo)查询:根据经纬度查询。例如:
- geo distance
- geo bounding box
- 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:
- bool
- function score
二、RestClient查询文档
2.1 全量查询
/** * 全量结果查询 * 查询结果返回及解析 * @throws IOException */ @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); //总体输出 //System.out.println(response); //4.解析响应 handleResponse(response); }
2.2 match条件查询
/** * match条件查询 * 查询结果返回及解析 * @throws IOException */ @Test void testMatch() throws IOException { //1.准备Request SearchRequest request = new SearchRequest("hotel"); //2.准备DSL request.source().query( QueryBuilders.matchQuery("all","7天")); //3.发送请求 SearchResponse response = client.search(request, RequestOptions.DEFAULT); //总体输出 //System.out.println(response); handleResponse(response); }
2.3 term 精确查询
/** * term 精确查询 * 查询结果返回及解析 * @throws IOException */ @Test void testTerm() throws IOException { //1.准备Request SearchRequest request = new SearchRequest("hotel"); //2.准备DSL request.source().query( QueryBuilders.termQuery("city","北京")); //3.发送请求 SearchResponse response = client.search(request, RequestOptions.DEFAULT); //总体输出 //System.out.println(response); handleResponse(response); }
2.4 Range 比较查询
/** * Range 比较查询 * 查询结果返回及解析 * @throws IOException */ @Test void testRange() throws IOException { //1.准备Request SearchRequest request = new SearchRequest("hotel"); //2.准备DSL request.source().query( QueryBuilders.rangeQuery("price").gte(100).lte(300)); //3.发送请求 SearchResponse response = client.search(request, RequestOptions.DEFAULT); //总体输出 //System.out.println(response); handleResponse(response); }
2.5 bool组合查询
/** * bool组合查询 * 查询结果返回及解析 * @throws IOException */ @Test void testBool() throws IOException { //1.准备Request SearchRequest request = new SearchRequest("hotel"); //2.准备DSL //2.1 准备BooleanQuery BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); //2.2 添加term boolQuery.must(QueryBuilders.termQuery("city","上海")); //2.3 添加range boolQuery.filter(QueryBuilders.rangeQuery("price").lte("300")); //添加搜索条件 request.source().query(boolQuery); //3.发送请求 SearchResponse response = client.search(request, RequestOptions.DEFAULT); //总体输出 //System.out.println(response); handleResponse(response); }
2.6 Page and Sort查询
/** * Page and Sort * 查询结果返回及解析 * @throws IOException */ @Test void testPageAndSort() throws IOException { //分页传参 公式:(page-1) * size int page =2 ,size = 5; //1.准备Request SearchRequest request = new SearchRequest("hotel"); //2.准备DSL //2.1 query request.source().query(QueryBuilders.matchAllQuery()); //2.2 排序 sort request.source().sort("price", SortOrder.ASC); //2.3 分页 from size request.source().from((page-1) * size).size(5); //3.发送请求 SearchResponse response = client.search(request, RequestOptions.DEFAULT); //总体输出 //System.out.println(response); handleResponse(response); }
2.7 HighLight 查询结果高亮显示
/** * HighLight * 查询结果返回及解析 * @throws IOException */ @Test void testHighLight() throws IOException { //1.准备Request SearchRequest request = new SearchRequest("hotel"); //2.准备DSL //2.1 query request.source().query(QueryBuilders.matchQuery("all","7天")); //2.2 高亮 request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false)); //3.发送请求 SearchResponse response = client.search(request, RequestOptions.DEFAULT); //总体输出 //System.out.println(response); handleResponse(response); }
2.8 handleResponse 函数
//抽取共同代码重构函数 (Ctrl + Alt + M) private void handleResponse(SearchResponse response) { //4.解析响应 SearchHits searchHits = response.getHits(); //4.1获取总条数 long total = searchHits.getTotalHits().value; System.out.println("共搜索到" + total + "条数据"); //4.2 文档数组 SearchHit[] hits = searchHits.getHits(); //4.3 遍历数组 for (SearchHit hit : hits) { //获取文档source String json = hit.getSourceAsString(); // 反序列化 HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class); //获取高亮结果 Map<String, HighlightField> highlightFields = hit.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); } }
至此,RestClient查询文档添加各种条件完成!精彩继续...