【ES】JavaAPI学习-07 组合查询 范围查询

在这里插入图片描述

前言

本节主要实现条件查询中的组合查询,范围查询

实现

组合查询

在ES中,组合查询和范围查询是常见的查询类型。

组合查询: 在Elasticsearch中,可以使用bool查询来组合多个查询条件。bool查询允许使用must、should、must_not和filter子句来组合其他查询:

GET _search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "field1": "value1" } },
        { "match": { "field2": "value2" } }
      ]
    }
  }
}

这里,Elasticsearch将返回同时满足field1为value1和field2为value2的文档。

编写组合查询
ESTest_Doc_Cond_Query_Com.java

package com.zwy.es;

import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;

public class ESTest_Doc_Cond_Query_Com {
    public static void main(String[] args) throws IOException {

        //
        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 组合查询数据
        SearchRequest request = new SearchRequest();
        request.indices("users");

        SearchSourceBuilder builer = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        
        boolQueryBuilder.must(QueryBuilders.matchQuery("age", 30));
        boolQueryBuilder.must(QueryBuilders.matchQuery("sex", "男"));
//        boolQueryBuilder.mustNot(QueryBuilders.matchQuery("sex", "女"));

        
        builer.query(boolQueryBuilder);

        request.source(builer);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);

        SearchHits hits = response.getHits();

        System.out.println(hits.getTotalHits());  // 打印
        System.out.println(response.getTook());  // 打印

        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }

        // 关闭ES客户端
        esClient.close();

    }
}

代码概要如下:

创建一个SearchRequest对象,指定要搜索的索引为"users"。

SearchRequest request = new SearchRequest();
request.indices("users");

创建一个SearchSourceBuilder对象,这个对象将用于构建查询条件。

SearchSourceBuilder builer = new SearchSourceBuilder();

创建一个BoolQueryBuilder对象,用于组合多个查询条件。在这个例子中,我们使用了两个must子句,表示文档必须同时满足这两个条件才能被返回。

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("age", 30));
boolQueryBuilder.must(QueryBuilders.matchQuery("sex", "男"));

将BoolQueryBuilder添加到SearchSourceBuilder中。

builer.query(boolQueryBuilder);

将构建好的SearchSourceBuilder设置到SearchRequest对象中。

request.source(builer);

使用RestHighLevelClient执行搜索请求,并获取响应。

SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);

从响应中获取搜索命中数(即匹配查询条件的文档数量)和查询所花费的时间。

结果查询"users"索引中年龄为30且性别为"男"的文档,并打印出查询结果的数量、查询耗时及每个匹配文档的源数据。

范围查询

范围查询在Elasticsearch中是通过range实现的,可以指定一个字段的值应该在某个范围内,或者特定于某个边界。
示例查询age字段在25到30之间的文档:

GET _search
{
  "query": {
    "range": {
      "age": {
        "gte": 25,
        "lte": 30
      }
    }
  }
}

这里返回所有age字段值大于等于25且小于等于30的结果

两种查询可以组合,如,查找age在25到30之间且field1为value1和field2为value2的文档:

GET _search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "field1": "value1" } },
        { "match": { "field2": "value2" } }
      ],
      "filter": {
        "range": {
          "age": {
            "gte": 25,
            "lte": 30
          }
        }
      }
    }
  }
}

在这里,must子句用于匹配文本字段,而filter子句中的range查询则用于过滤出年龄在指定范围内的文档,由于filter子句不会影响相关性评分,所以通常用于这样的过滤条件。

编写范围查询
ESTest_Doc_Cond_Query_Range.java

package com.zwy.es;

import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;

public class ESTest_Doc_Cond_Query_Range {
    public static void main(String[] args) throws IOException {

        //
        RestHighLevelClient esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 范围查询数据
        SearchRequest request = new SearchRequest();
        request.indices("users");

        SearchSourceBuilder builer = new SearchSourceBuilder();
        RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");  // 设定年龄范围
        rangeQuery.gte(30);
        rangeQuery.lte(40);

        builer.query(rangeQuery);

        request.source(builer);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);

        SearchHits hits = response.getHits();

        System.out.println(hits.getTotalHits());  // 打印
        System.out.println(response.getTook());  // 打印

        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }

        // 关闭ES客户端
        esClient.close();

    }
}

代码概要如下:

创建一个RestHighLevelClient实例

RestHighLevelClient esClient = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
``
创建SearchRequest对象,指定要搜索的索引为"users"。
```java
SearchRequest request = new SearchRequest();
request.indices("users");

创建SearchSourceBuilder对象,这个对象将用于构建查询条件。

SearchSourceBuilder builer = new SearchSourceBuilder();

创建RangeQueryBuilder对象,用于指定年龄字段的范围查询,我们设置了年龄大于等于30且小于等于40。

RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");  // 设定年龄范围
rangeQuery.gte(30);  // 大于等于30
rangeQuery.lte(40);  // 小于等于40

将RangeQueryBuilder添加到SearchSourceBuilder中。

builer.query(rangeQuery);

将构建好的SearchSourceBuilder设置到SearchRequest对象中。

request.source(builer);

使用RestHighLevelClient执行搜索请求,并获取响应。

SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);

从响应中获取搜索命中数(即匹配查询条件的文档数量)和查询所花费的时间。

System.out.println(hits.getTotalHits()); // 打印总命中数
System.out.println(response.getTook()); // 打印查询所花费的时间

遍历所有命中结果,打印每个文档的源数据。

for (SearchHit hit : hits) {
    System.out.println(hit.getSourceAsString());
}

这里我们查询"users"索引中年龄在30到40之间的文档,并打印出查询结果的数量、查询耗时及每个匹配文档的源数据。

文件结构

文件结构如下:

在这里插入图片描述

运行

运行ESTest_Doc_Cond_Query_Com.java,结果如下:

在这里插入图片描述

运行ESTest_Doc_Cond_Query_Range.java,结果如下:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,您的问题是如何使用 Java API 获取 Elasticsearch 中的总数。 您可以使用 Elasticsearch Java API 中的 `SearchRequest` 和 `SearchResponse` 来实现。具体实现步骤如下: 1. 创建一个 `SearchRequest` 对象,并设置需要查询的 index。 ```java SearchRequest searchRequest = new SearchRequest("your_index_name"); ``` 2. 创建一个 `SearchSourceBuilder` 对象,并设置需要查询的条件。这里我们只需要查询总数,所以只需要设置一个 `size` 为 0 的参数即可。 ```java SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(0); ``` 3. 将 `SearchSourceBuilder` 对象设置到 `SearchRequest` 中。 ```java searchRequest.source(searchSourceBuilder); ``` 4. 执行查询,并获取查询结果中的总数。 ```java SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); long totalHits = searchResponse.getHits().getTotalHits().value; ``` 注意:在执行查询之前,需要先创建一个 `RestHighLevelClient` 对象,并设置好连接 Elasticsearch 的参数。 完整的 Java 代码示例: ```java RestHighLevelClient restHighLevelClient = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); SearchRequest searchRequest = new SearchRequest("your_index_name"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(0); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); long totalHits = searchResponse.getHits().getTotalHits().value; restHighLevelClient.close(); ``` 希望这个回答能够帮助到您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锥栗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值