ElasticSearch之RestClient查询文档

ElasticSearch之RestClient查询文档

一、DSL查询语法
DSL Query的分类
 
Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:
  1. 查询所有:查询出所有数据,一般测试用。
  • ​例如:matchall
  1. 全文检索(fulltext)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:
  • match query
  • multi match query
  1. 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:
  • ids
  • range
  • term
  1. 地理(geo)查询:根据经纬度查询。例如:
  • geo distance
  • geo bounding box
  1. 复合(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 + Mprivate 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查询文档添加各种条件完成!精彩继续...

 

相关推荐

    Docker搭建elasticsearch集群(3节点)【二】

    Docker搭建elasticsearch集群(3节点)【二】

    Docker搭建elasticsearch集群(3节点)【一】

    Docker搭建elasticsearch集群(3节点)【一】

    IDEA连接ElasticSearch添加索引数据(二)

    IDEA连接ElasticSearch添加索引数据(二)