RestHighLevelClient 执行 matchQuery、multiMatchQuery、termQuery、rangeQuery 和 boolQuery查询

Elasticsearch 是一个基于 Lucene 的搜索引擎,提供了丰富的查询功能。在 Java 应用程序中,我们可以使用 Elasticsearch 的 RestHighLevelClient 来执行各种查询。本文将介绍如何使用 RestHighLevelClient 执行 matchQuerymultiMatchQuerytermQueryrangeQueryboolQuery,并提供每种查询对应的 DSL 对比。

环境准备

确保你的项目中已经添加了 Elasticsearch 客户端库的依赖。如果使用 Maven,可以在 pom.xml 文件中添加如下依赖:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level</artifactId>
    <version>7.10.0</version> <!-- 使用适合的版本号 -->
</dependency>

查询示例

1. Match Query

Java Code
@Test
void matchQueryTest() throws IOException {
    // 1. 准备 SearchRequest
    SearchRequest request = new SearchRequest("hotel"); // 指定索引名称

    // 2. 准备 DSL 查询
    request.source().query(
            QueryBuilders.matchQuery("name", "如家") // 构建查询条件
    );

    // 3. 发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);

    // 4. 解析响应
    printSearchResponse(response);
}
DSL Equivalent
GET /hotel/_search
{
  "query": {
    "match": {
      "name": "如家"
    }
  }
}

2. Multi Match Query

Java Code
@Test
void multiMatchQueryTest() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    request.source().query(
            QueryBuilders.multiMatchQuery("如家", "name", "description")
    );
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    printSearchResponse(response);
}
DSL Equivalent
GET /hotel/_search
{
  "query": {
    "multi_match": {
      "query": "如家",
      "fields": ["name", "description"]
    }
  }
}

3. Term Query

Java Code
@Test
void termQueryTest() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    request.source().query(
            QueryBuilders.termQuery("city", "杭州")
    );
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    printSearchResponse(response);
}
DSL Equivalent
GET /hotel/_search
{
  "query": {
    "term": {
      "city": "杭州"
    }
  }
}

4. Range Query

Java Code
@Test
void rangeQueryTest() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    request.source().query(
            QueryBuilders.rangeQuery("price").gte(100).lte(250)
    );
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    printSearchResponse(response);
}
DSL Equivalent
GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 100,
        "lte": 250
      }
    }
  }
}

5. Bool Query

Java Code
@Test
void boolQueryTest() throws IOException {
    SearchRequest request = new SearchRequest("hotel");
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    boolQuery.must(QueryBuilders.termQuery("city", "杭州"));
    boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
    request.source().query(boolQuery);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    printSearchResponse(response);
}
DSL Equivalent
GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "city": "杭州"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "price": {
              "lte": 250
            }
          }
        }
      ]
    }
  }
}

通用响应解析方法

private void printSearchResponse(SearchResponse response) throws IOException {
    SearchHits searchHits = response.getHits();
    long total = searchHits.getTotalHits().value;
    System.out.println("共搜索到 " + total + " 条数据");
    for (SearchHit hit : searchHits.getHits()) {
        String json = hit.getSourceAsString();
        System.out.println(json);
    }
}

结语

通过上述示例,我们可以看到如何使用 Java 的 RestHighLevelClient 来执行不同类型的 Elasticsearch 查询,并与 DSL 查询进行了对比。这些查询类型覆盖了大多数搜索场景,从简单的全文搜索到复杂的复合查询。理解这些查询的构建方式对于开发高效的搜索应用至关重要。希望本文能帮助你更好地使用 Elasticsearch 的查询功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值