Elasticsearch Java API boolQuery

时间:2018-11-04 17:31:08

标签: java elasticsearch

我正在使用Elasticsearch 6.4.2版

我成功使用REST API创建了GET查询,现在我想使用JAVA api执行相同的查询。

这是查询:

GET _search
{
   "query":{
      "bool":{
         "must":{
            "match":{
               "tags":"kpi"
            }
         },
         "filter":{
            "range":{
               "@timestamp":{
                  "gt":"now-5m"
               }
            }
         }
      }
   }
}

我阅读了这份文档:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-compound-queries.html,但对于我是否正在寻找它以及如何使用它,我仍然不清楚。 考虑到查询可能返回很多必须由我的Java应用程序处理的结果。

而且,由于我必须每5分钟执行一次此查询,因此如何优化它(如果可能)?

2 个答案:

答案 0 :(得分:2)

如果您的项目基于Maven,则可以使用elasticsearch客户依赖项:

    Document mergePdfDoc = new Document();
    PdfCopy pdfCopy;
    boolean smartCopy = false;

    FileOutputStream newmergeOutStream = new FileOutputStream(new File("C:\\UpdateFile\\mergepath\\newmerged.pdf"));

    if(smartCopy)
        pdfCopy = new PdfSmartCopy(mergePdfDoc, newmergeOutStream);
    else
        pdfCopy = new PdfCopy(mergePdfDoc, newmergeOutStream);

    mergePdfDoc.open();

    PdfReader reader = new PdfReader(new FileInputStream(new File("C:\\UpdateFile\\mergepath\\updatetem.pdf")));
    pdfCopy.addDocument(reader);
    pdfCopy.freeReader(reader);

    PdfReader[] pdfReader = new PdfReader[userInfoFiles.length];

    for(int i=0; i<=userInfoFiles.length-1;i++) {
            pdfReader[i] = new PdfReader(userInfoFiles[i].getInputStream());
            pdfCopy.addDocument(pdfReader[i]);
            pdfCopy.freeReader(pdfReader[i]);
            pdfReader[i].close();
    }

    mergeOutStream.close();
    mergePdfDoc.close();
}

您所需的查询将是:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>5.6.2</version>
</dependency>

最后要执行查询,您可以使用val query = QueryBuilders.boolQuery() .must( QueryBuilders.rangeQuery("timestamp").from(startDate) ) .must( QueryBuilders.termQuery("tags", "kpi") ) client.search(query)client类型。

答案 1 :(得分:0)

这是有效的确切代码:

Date dateFrom = new Date(System.currentTimeMillis() - 300 * 1000);
Date dateTo = new Date(System.currentTimeMillis());

BoolQueryBuilder query = QueryBuilders.boolQuery()
    .must(QueryBuilders.rangeQuery("@timestamp").from(dateFrom).to(dateTo))
    .must(QueryBuilders.matchQuery("tags", "kpi"));

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(query);
SearchRequest searchRequest = new SearchRequest();
searchRequest.source(searchSourceBuilder);
System.out.println(query.toString());
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

logger.log(Level.INFO, "Status: {0}", new Object[] { searchResponse.status() });
logger.log(Level.INFO, "Took: {0}", new Object[] { searchResponse.getTook() });
logger.log(Level.INFO, "IsTerminatedEarly: {0}", new Object[] { searchResponse.isTerminatedEarly() });
logger.log(Level.INFO, "TimedOut: {0}", new Object[] { searchResponse.isTimedOut() });
logger.log(Level.INFO, "TotalShards: {0}", new Object[] { searchResponse.getTotalShards() });
logger.log(Level.INFO, "SuccessfulShards: {0}", new Object[] { searchResponse.getSuccessfulShards() });
logger.log(Level.INFO, "FailedShards: {0}", new Object[] { searchResponse.getFailedShards() });
logger.log(Level.INFO, "Total Hits: {0}", new Object[] { searchResponse.getHits().getTotalHits() });