elasticsearch查询中文释义、JAVA的API以及kibana上查询

这篇博客详细介绍了Elasticsearch(ES)的多种查询方式,包括term和terms查询、match_all和match查询、布尔match、multiMatch、id和ids查询、prefix、fuzzy、wildcard、range、regexp查询,以及深分页Scroll、delete-by-query操作。此外,还涉及到了bool、boosting、filter、高亮、聚合查询等复合查询,特别是地理坐标查询的实现,包括RESTFUL和Java API的应用。

目录

一、创建表结构:

二、ES的各种查询

2.1term&terms查询

2.1.1term查询(我试了下province没有办法查询,需到后面加个.keyword)

2.1.2terms查询

2.2match_all&match查询

2.2.1match_all

2.2.2match查询

  2.2.3布尔match查询

  2.2.4mulitMatch查询

2.3id&ids查询

2.3.1id查询

2.3.2ids查询

2.4prefix查询

2.5fuzzy查询

2.6wildcard查询

2.7range查询

2.7regexp查询

2.8深分页Scroll

2.9delete-by-query

 3.0复合查询

3.0.1bool查询

3.0.2boosting查询

 3.1filter查询

3.2高亮查询

3.3聚合查询

3.3.1去重计数查询(cardinality)

3.3.2范围统计

3.3.3统计聚合查询

 3.4地图经纬度查询

 3.4.1地图检索方式

 3.4.2基于RESTFUL实现地图检索

 3.4.3java实现geo_polygon检索



=

一、创建表结构:

 

二、ES的各种查询

2.1term&terms查询

2.1.1term查询(我试了下province没有办法查询,需到后面加个.keyword)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

package com.qf.test;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.qf.utils.ESClient;

import org.elasticsearch.action.search.SearchRequest;

import org.elasticsearch.action.search.SearchRequestBuilder;

import org.elasticsearch.action.search.SearchResponse;

import org.elasticsearch.client.RequestOptions;

import org.elasticsearch.client.RestHighLevelClient;

import org.elasticsearch.index.query.QueryBuilder;

import org.elasticsearch.index.query.QueryBuilders;

import org.elasticsearch.search.SearchHit;

import org.elasticsearch.search.builder.SearchSourceBuilder;

import org.junit.Test;

import java.io.IOException;

import java.util.Map;

public class Demo4 {

    ObjectMapper mapper=new ObjectMapper();

    RestHighLevelClient client = ESClient.getClient();

    String index="sms-logs-index";

    String type="sms-logs-type";

    @Test

    public void termQuery() throws IOException {

        //1.创建request对象

        SearchRequest searchRequest=new SearchRequest(index);

        searchRequest.types(type);

        //2.指定查询条件

        SearchSourceBuilder builder=new SearchSourceBuilder();

        builder.from(0);

        builder.size(5);

        builder.query(QueryBuilders.termQuery("province.keyword","北京"));

        searchRequest.source(builder);

        //执行查询

        SearchResponse rsp=client.search(searchRequest, RequestOptions.DEFAULT);

        //输出结果

        for (SearchHit hit:rsp.getHits().getHits()) {

            Map<String,Object> result=hit.getSourceAsMap();

            System.out.println(result);

             

        }

             

        }

   }

  

2.1.2terms查询

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

POST /sms-logs-index/sms-logs-type/_search

{

  "from": 0,

  "size": 5,

  "query":{

  "terms":{

    "province.keyword":[

      "江苏",

      "北京",

      "南通"

    ]

     

   }

  }

}

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

@Test

 public void termsQuerry() throws IOException {

     SearchRequest request=new SearchRequest(index);

     request.types(type);

     SearchSourceBuilder builder=new SearchSourceBuilder();

     builder.query(QueryBuilders.termsQuery("province.keyword","南通","江苏"));

     request.source(builder);;

     SearchResponse rsp=client.search(request, RequestOptions.DEFAULT);

     //输出结果

     for (SearchHit hit:rsp.getHits().getHits()) {

         Map<String,Object> result=hit.getSourceAsMap();

         System.out.println(result);

 }

}}

  

2.2match_all&match查询

2.2.1match_all

1

2

3

4

5

6

POST /sms-logs-index/sms-logs-type/_search

{

  "query": {

    "match_all": {}

  }

  }

  注:ES默认查询10条数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@Test

   public void  matchAllQuery() throws IOException {

       SearchRequest request=new SearchRequest(index);

       request.types(type);

        

       SearchSourceBuilder builder=new SearchSourceBuilder();

       builder.query(QueryBuilders.matchAllQuery());

       builder.size(20);//ES默认查询10条数据

           request.source(builder);

       SearchResponse rsp=client.search(request, RequestOptions.DEFAULT);

        for (SearchHit hit: rsp.getHits().getHits()) {

            System.out.println(hit.getSourceAsMap());

       }

   }

  

2.2.2match查询

POST /sms-logs-index/sms-logs-type/_search
{
  "query": {
    "match": {
      "smsContent": "恭喜"
    }
  }
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@Test

  public void  matchQuery() throws IOException {

      SearchRequest request=new SearchRequest(index);

      request.types(type);

      SearchSourceBuilder builder=new SearchSourceBuilder();

      builder.query(QueryBuilders.matchQuery("smsContent","恭喜"));

      builder.size(20);//ES默认查询10条数据

      request.source(builder);

      SearchResponse rsp=client.search(request, RequestOptions.DEFAULT);

      for (SearchHit hit: rsp.getHits().getHits()) {

          System.out.println(hit.getSourceAsMap());

      }

  }

  2.2.3布尔match查询

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public void  booleanMatchQuery() throws IOException {

    SearchRequest request=new SearchRequest(index);

    request.types(type);

    SearchSourceBuilder builder=new SearchSourceBuilder();

    builder.query(QueryBuilders.matchQuery("smsContent","恭喜 高级").operator(Operator.AND));

    builder.size(20);//ES默认查询10条数据

    request.source(builder);

    SearchResponse rsp=client.search(request, RequestOptions.DEFAULT);

    for (SearchHit hit: rsp.getHits().getHits()) {

        System.out.println(hit.getSourceAsMap());

    }

}

  2.2.4mulitMatch查询

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@Test

   public void  mulitMatchQuery() throws IOException {

       SearchRequest request=new SearchRequest(index);

       request.types(type);

       SearchSourceBuilder builder=new SearchSourceBuilder();

       builder.query(QueryBuilders.multiMatchQuery("北京","province","smsContent"));

       builder.size(20);//ES默认查询10条数据

       request.source(builder);

       SearchResponse rsp=client.search(request, RequestOptions.DEFAULT);

       for (SearchHit hit: rsp.getHits().getHits()) {

           System.out.println(hit.getSourceAsMap());

       }

   }

  

2.3id&ids查询

2.3.1id查询

 @Test
    public  void findByid() throws IOException {
        GetRequest request=new GetRequest(index,type,"1");
        GetResponse rsp=client.get(request, RequestOptions.DEFAULT);
        System.out.println(rsp.getSourceAsMap());

    }

2.3.2ids查询

    @Test
    public void findByids() throws IOException {
        SearchRequest request=new SearchRequest(index);
        request.types(type);

        SearchSourceBuilder builder=new SearchSourceBuilder();
        builder.query(QueryBuilders.idsQuery().addIds("1","2","3"));
        request.source(builder);
        SearchResponse rsp=client.search(request, RequestOptions.DEFAULT);
        for (SearchHit hit: rsp.getHits().getHits()) {
            System.out.println(hit.getSourceAsMap());
        }
    }

2.4prefix查询

 @Test
    public void findByPrefix() throws IOException {
        SearchRequest request=new SearchRequest(index);
        request.types(type);

        SearchSourceBuilder builder=new SearchSourceBuilder();
        builder.query(QueryBuilders.prefixQuery("corpName","恭喜"));
        request.source(builder);
        SearchResponse rsp=client.search(request, RequestOptions.DEFAULT);
        for (SearchHit hit: rsp.getHits().getHits()) {
            System.out.println(hit.getSourceAsMap());
        }
    }

2.5fuzzy查询

  @Test
    public void findByfuzzy() throws IOException {
        SearchRequest request=new SearchRequest(index);
        request.types(type);

        SearchSourceBuilder builder=new SearchSourceBuilder();
        builder.query(QueryBuilders.fuzzyQuery("corpName","恭喜您").prefixLength(2));
        request.source(builder);
        SearchResponse rsp=client.search(request, RequestOptions.DEFAULT);
        for (SearchHit hit: rsp.getHits().getHits()) {
            System.out.println(hit.getSourceAsMap());
        }
    }

2.6wildcard查询

2.7range查询

2.7regexp查询

2.8深分页Scroll

2.9delete-by-query

 3.0复合查询

3.0.1bool查询

POST /sms-logs-index/sms-logs-type/_search
{
  "query":{
    "bool":{
      "should": [
        {
          "term": {
            "province": {
              "value": "北京"
            }
          }
        },
        {
          "term": {
            "province": {
              "value": "南通"
            }
          }
        }
      ],
       "must_not": [
        {
          "term": {
            "operatorId": {
              "value": "2"
            }
          }
        }
      ],
      "must": [
        {
          "match": {
            "smsContent": "恭喜"
          }
        },
        {
          "match": {
            "smsContent": "黑卡"
          }
        }
      ]
      
    }
  }
}

 View Code

3.0.2boosting查询

 View Code

 3.1filter查询

 View Code

3.2高亮查询

3.3聚合查询

3.3.1去重计数查询(cardinality)

3.3.2范围统计

3.3.3统计聚合查询

 3.4地图经纬度查询

 3.4.1地图检索方式

 3.4.2基于RESTFUL实现地图检索

 3.4.3java实现geo_polygon检索

@Test
    public void geoPolygon() throws IOException {
        //1.创建SearchRequest
        SearchRequest request=new SearchRequest(index);
        request.types(type);

        //2.指定查询方式
        SearchSourceBuilder builder = new SearchSourceBuilder();
        List<GeoPoint> points=new ArrayList<>();
        points.add(new GeoPoint(39.99878,116.298915));
        points.add(new GeoPoint(39.972576,116.29561));
        points.add(new GeoPoint(39.984739,116.327661));

        builder.query(QueryBuilders.geoPolygonQuery("location",points));
        request.source(builder);
        //3.执行查询
        SearchResponse rsp=client.search(request, RequestOptions.DEFAULT);
       //4.输出结果
        for (SearchHit hit:rsp.getHits().getHits()
        ) {
            System.out.println(hit.getSourceAsMap());

        }
    }

<think>首先,用户的问题是:“我想在Java中使用Elasticsearch 8构建包含多个条件查询 请问Java Elasticsearch 8 多条件查询构建方法”。这涉及到Elasticsearch 8的Java客户端,用于构建多条件查询。 根据系统指令,我需要: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 - 在行内数学表达式中使用$...$,独立公式使用$$...$$。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如[^1]。 用户引用了几个站内引用: - 引用[1]:关于ElasticSearch Java查询实现。 - 引用[2]:关于Elasticsearch查询的用法。 - 引用[3]:关于构建查询条件- 引用[4]:关于Elasticsearch查询条件示例。 这些引用提供了背景,但用户的问题具体是构建多条件查询Elasticsearch 8中。我需要基于这些和一般知识来回答。 关键点: - Elasticsearch 8使用Java High Level REST Client(现在可能是Elasticsearch Java API Client,因为旧版High Level Client在7.15后弃用,8.x推荐使用新客户端)。 -Elasticsearch 8中,官方推荐使用新的Elasticsearch Java API Client,它更类型安全,基于构建器模式。 -条件查询通常涉及布尔查询(Boolean Query),组合多个查询条件。 结构回答: 1. **介绍**:简要解释多条件查询的重要性。 2. **环境准备**:确保用户有必要的依赖。 3. **构建查询**:逐步展示如何构建多条件查询- 使用布尔查询(Boolean Query)。 - 添加must、should、must_not等子句。 4. **代码示例**:提供Java代码示例。 5. **注意事项**:提醒版本兼容性等。 6. **生成相关问题**:在最后添加相关问题。 代码示例: - 使用Elasticsearch Java API Client for 8.x。 - 假设用户有基本设置,如客户端初始化。 依赖: - 对于Elasticsearch 8,添加依赖:`co.elastic.clients:elasticsearch-java:8.13.4`(或最新版本)。 查询构建: - 使用`QueryBuilders`或直接构建查询对象。 -Elasticsearch Java API Client中,使用`Query`类。 引用标识: - 在回答中,如果需要引用站内内容,自然地添加[^1]、[^2]等。 生成相关问题: - 在回答结束时,添加“§§相关问题§§”部分,列出相关问题。 回答大纲: 1. **引言**:解释多条件查询。 2. **环境设置**:简述依赖和初始化。 3. **核心方法**:构建布尔查询。 4. **代码实现**:提供完整示例。 5. **总结**:简要回顾。 6. **相关问题**:生成2-3个相关问题。</think>### Java Elasticsearch 8 多条件查询构建方法 在 Java 中使用 Elasticsearch 8 构建多条件查询,是处理复杂搜索需求的常见场景。Elasticsearch 8 推荐使用新的 Java API Client(基于构建器模式),它更类型安全且高效。多条件查询的核心是布尔查询(Boolean Query),它允许组合多个子查询(如 must、should、must_not),实现逻辑“与”“或”“非”等操作。以下我将逐步指导您完成整个过程,确保方法可靠且基于官方文档最佳实践[^3]。 #### 1. **环境准备** 在开始前,确保您的项目已添加 Elasticsearch 8 Java API Client 依赖。推荐使用 Maven 或 Gradle: - **Maven 依赖**: ```xml <dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> <version>8.13.4</version> <!-- 使用最新版本 --> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.1</version> <!-- 确保兼容性 --> </dependency> ``` - **初始化客户端**: 创建 `ElasticsearchClient` 实例,用于执行查询(假设您已配置集群地址和认证): ```java import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.json.jackson.JacksonJsonpMapper; import co.elastic.clients.transport.ElasticsearchTransport; import co.elastic.clients.transport.rest_client.RestClientTransport; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; public class ElasticsearchUtil { public static ElasticsearchClient createClient() { // 替换为您的 Elasticsearch 节点地址 RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http") ).build(); ElasticsearchTransport transport = new RestClientTransport( restClient, new JacksonJsonpMapper() ); return new ElasticsearchClient(transport); } } ``` 注意:Elasticsearch 8 弃用了旧版 High Level REST Client,新 API Client 更简洁[^1][^4]。 #### 2. **构建多条件查询的核心方法** 多条件查询通过 `BoolQuery` 实现,它支持以下子句: - `must`:所有条件必须匹配(逻辑“与”)。 - `should`:至少一个条件匹配(逻辑“或”),常与 `minimumShouldMatch` 配合。 - `mustNot`:条件不能匹配(逻辑“非”)。 - `filter`:过滤条件,不参与相关性评分,性能更高。 数学上,布尔查询可表示为: $$ \text{BoolQuery} = \left\{ \text{must} \land \text{should} \land \neg \text{mustNot} \right\} $$ 其中,$\land$ 表示“与”,$\neg$ 表示“非”。 #### 3. **完整代码示例** 以下是一个综合示例,展示如何构建包含多个条件查询(如全文搜索、范围过滤和精确匹配): ```java import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch.core.SearchRequest; import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.elasticsearch.core.search.Hit; import co.elastic.clients.json.JsonData; import co.elastic.clients.elasticsearch._types.query_dsl.*; import java.io.IOException; import java.util.List; public class MultiConditionQueryExample { public static void main(String[] args) throws IOException { ElasticsearchClient client = ElasticsearchUtil.createClient(); // 使用上述初始化方法 // 步骤1: 构建多个子查询条件 // 全文检索查询 (Match Query): 在 "title" 字段搜索关键词 Query titleMatch = MatchQuery.of(m -> m .field("title") .query("Elasticsearch") )._toQuery(); // 精确查询 (Term Query): "category" 字段必须为 "technology" Query categoryTerm = TermQuery.of(t -> t .field("category.keyword") // 使用.keyword避免分词 .value("technology") )._toQuery(); // 范围查询 (Range Query): "price" 字段在 100 到 500 之间 Query priceRange = RangeQuery.of(r -> r .field("price") .gte(JsonData.of(100)) .lte(JsonData.of(500)) )._toQuery(); // 步骤2: 组合为布尔查询 (Bool Query) Query boolQuery = BoolQuery.of(b -> b .must(titleMatch) // 必须匹配标题 .must(categoryTerm) // 必须匹配类别 .should(priceRange) // 应该匹配价格范围 .minimumShouldMatch("1") // 至少满足一个should条件 )._toQuery(); // 步骤3: 执行查询 SearchRequest request = SearchRequest.of(s -> s .index("products") // 替换为您的索引名 .query(boolQuery) ); SearchResponse<Object> response = client.search(request, Object.class); // 处理结果 List<Hit<Object>> hits = response.hits().hits(); for (Hit<Object> hit : hits) { System.out.println("文档ID: " + hit.id() + ", 分数: " + hit.score()); } } } ``` **代码说明**: - **子查询构建**:使用 `MatchQuery`、`TermQuery` 和 `RangeQuery` 分别处理不同条件Elasticsearch 8 的 API 采用函数式构建器,避免字符串拼接错误[^3]。 - **布尔查询组合**:`BoolQuery` 将子查询逻辑整合,`minimumShouldMatch` 确保至少一个 `should` 条件满足。 - **性能优化**:`filter` 子句可用于不参与评分的条件(如状态过滤),提升查询速度[^4]。 - **错误处理**:添加 `try-catch` 处理 `IOException`,确保资源释放。 #### 4. **关键注意事项** - **版本兼容性**:Elasticsearch 8 API 与旧版不兼容,请确保依赖版本一致(如 `co.elastic.clients:elasticsearch-java:8.x`)[^4]。 - **字段类型**:精确查询(如 `TermQuery`)需使用 `.keyword` 字段,避免分词影响;全文查询(如 `MatchQuery`)适用于文本字段。 - **查询性能**:优先使用 `filter` 替代 `must` 对非相关性条件,减少计算开销。例如,过滤状态为“active”的记录: ```java Query statusFilter = TermQuery.of(t -> t .field("status.keyword") .value("active") )._toQuery(); // 在BoolQuery中添加 BoolQuery.of(b -> b.filter(statusFilter)); ``` - **调试建议**:使用 Kibana Dev Tools 测试查询 DSL,再转换为 Java 代码,确保逻辑正确[^4]。 #### 总结 在 Elasticsearch 8 中构建多条件查询,核心是灵活运用 `BoolQuery` 组合子查询。本文提供了从环境配置到代码实现的完整流程,覆盖了全文检索、精确匹配和范围过滤等常见场景。Elasticsearch Java API Client 的类型安全设计,减少了运行时错误,是处理复杂查询的首选[^1][^3]。如果您有索引映射或数据示例,我可以进一步优化查询逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值