【问题标题】:Elasticsearch java api or filterElasticsearch java api 或过滤器
【发布时间】:2016-04-01 17:27:03
【问题描述】:

我需要应用一个“OR”过滤器,它相当于('a' or 'b' or 'c' or 'd' or 'e')中的类别,下面提供了一个等效的 ES 查询

"query_string": {
                      "query": "category: (\"a\", \"b\", \"c\", \"d\", \"e\")"
                   }

我有下面提到的 JAVA ES API 代码,我对在 Java 中添加 OR 过滤器感到震惊。有人可以帮忙吗?

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
     searchSourceBuilder.query(QueryBuilders.boolQuery()
                .must(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),
                        FilterBuilders.termFilter("category","a")))
                .must(QueryBuilders.rangeQuery("@timestamp").from(fromHr).to(toHr)))
                .fields(fieldList);

【问题讨论】:

    标签: java elasticsearch elasticsearch-java-api


    【解决方案1】:

    根据您的示例,我假设您使用的是 ES 1.x 并假设 RangeQuery 应该是一个查询。如果我正确理解你的问题,你想做这样的事情:

    QueryBuilders.filteredQuery(
     QueryBuilders.rangeQuery("@timestamp").from(fromHr).to(toHr),
     FilterBuilders.boolFilter()
      .should(FilterBuilders.termFilter("category","a"))
      .should(FilterBuilders.termFilter("category","b")) 
      .should(FilterBuilders.termFilter("category","c")) 
      .should(FilterBuilders.termFilter("category","d"))   
      .should(FilterBuilders.termFilter("category","e"))
    )
    

    不过,您也可以使用terms filter

    QueryBuilders.filteredQuery(
      QueryBuilders.rangeQuery("@timestamp").from(fromHr).to(toHr),
      FilterBuilders.termsFilter("category", "a", "b", "c", "d", "e", "f" ))
    

    【讨论】:

    • 非常感谢迈克尔!
    猜你喜欢
    • 2017-07-31
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2017-08-19
    • 2014-10-09
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多