【问题标题】:Howto create a bool query with Elasticsearch Java RestHighLevelClient API如何使用 Elasticsearch Java RestHighLevelClient API 创建布尔查询
【发布时间】:2019-02-07 16:44:05
【问题描述】:

如何使用RestHighLevelClientbool 下方创建查询?

我的尝试没有返回任何东西:

BoolQueryBuilder query = boolQuery()
                .must(queryStringQuery(queryString).analyzeWildcard(true).defaultField("*"))
                .must(rangeQuery("timestamp").gte(fromTs).lte(toTs).format("epoch_millis")
                );

我想要

"query":{  
      "bool":{  
         "must":[  
            {  
               "query_string":{  
                  "query":"foo:evlis AND bar:beatles",
                  "analyze_wildcard":true,
                  "default_field":"*"
               }
            },
            {  
               "range":{  
                  "timestamp":{  
                     "gte":1549360021398,
                     "lte":1549446421398,
                     "format":"epoch_millis"
                  }
               }
            }
         ],
         "filter":[  

         ],
         "should":[  

         ],
         "must_not":[  

         ]
      }
   }

更新 我在org.elasticsearch.client 上启用了调试日志记录,并且可以看到这个调试输出。 当我点击调试日志中的链接时,我可以看到结果。

2019-02-07 19:20:11.351 DEBUG 17524 --- [/O dispatcher 1] org.elasticsearch.client.RestClient      : request 
[POST http://10.134.39.147:31429/journey/_doc/_search?typed_keys=true&ignore_unavailable=false&expand_wildcards=open&allow_no_indices=true&search_type=query_then_fetch&batched_reduce_size=512] 
returned [HTTP/1.1 200 OK]

然而searchResponse.getHits()为空,0次点击???

    private void printResult(SearchResponse response) {
        System.out.println("=== HTTP Request ===");
        System.out.println("status: " + response.status());
        System.out.println("took: " + response.getTook());
        System.out.println("timed_out: " + response.isTimedOut());

        System.out.println("\n=== Hits ===");
        final SearchHits hits = response.getHits();
        System.out.println("total_hits: " + hits.getHits().length);

        List<Journey> journeys = new ArrayList<>();
        for (SearchHit hit : hits.getHits()) {
            System.out.println("\n=== Documents ===");
            System.out.println("index: " + hit.getIndex());
            System.out.println("type: " + hit.getType());
            System.out.println("id: " + hit.getId());
            System.out.println("source: " + hit.getSourceAsString());
        }
    }

输出

=== HTTP Request ===
status: OK
took: 19ms
timed_out: false

=== Hits ===
total_hits: 0

【问题讨论】:

  • 您应该通过调试 elasticsearch 请求来检查您生成的查询。

标签: elasticsearch elasticsearch-java-api elasticsearch-rest-client


【解决方案1】:

步骤:

  1. 创建一个新对象 SearchSourceBuilder sourceBuilder
  2. 创建一个新的 BoolQueryBuilder 对象boolQueryBuilder
  3. 使用 QueryBuilders 添加到必须的 boolQueryBuilderqueryStringQuery
  4. 使用 QueryBuilders 添加到必须的 boolQueryBuilderrangeQuery
  5. 添加 boolQueryBuilder 作为 sourceBuilder 的查询。

所以您的查询转换为:

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
boolQueryBuilder.must(
    QueryBuilders.queryStringQuery("foo:evlis AND bar:beatles").defaultField("*")
        .analyzeWildcard(true));
boolQueryBuilder.must(
    QueryBuilders.rangeQuery("timestamp").gte(1549360021398l).lte(1549446421398l)
        .format("epoch_millis"));
sourceBuilder.query(boolQueryBuilder);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2017-09-18
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    相关资源
    最近更新 更多