【问题标题】:Elasticsearch Java Jest client query builder range with bool queryElasticsearch Java Jest 客户端查询构建器范围与布尔查询
【发布时间】:2018-04-05 13:35:01
【问题描述】:

我需要使用 Jest 客户端进行 Elasticsearch 查询,以匹配一些术语和日期与范围查询。因此,我需要使用 Jest QueryBuilder 执行带有范围查询的 bool 查询,以获得这样的请求:

{
"query": {
    "range": {
        "gte": "begindate",
        "lte": "enddate"
    },
    "bool": {
        "must": [
            {
                "terms": {
                    "field1": [
                        55,
                        99
                    ]
                }
            },
            {
                "terms": {
                    "field2": [
                        450
                    ]
                }
            },
            {
                "terms": {
                    "field3": [
                        11
                    ]
                }
            }
        ]
    }
}

}

为此,我像这样使用queryBuilder

Builder search = null;
Search buildedSearch = null;
SearchResult result = null;

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder qb = QueryBuilders.boolQuery();

if (field1 != null) {
    qb.must(QueryBuilders.termsQuery("field1", field1));
}

if (field2 != null) {
    qb.must(QueryBuilders.termsQuery("field2", field2));
}

if (field3 != null) {
    qb.must(QueryBuilders.termsQuery("field3", field3));
}

String query = searchSourceBuilder.query(qb).toString();

if (field != null) {
    search = new Search.Builder(query).addIndex(index).addType(type);
    if (beginIndex != -1) {
        search.setParameter(Parameters.FROM, beginIndex);
    }

    if (endIndex != -1) {
        search.setParameter(Parameters.SIZE, endIndex);
    }

    buildedSearch = search.build();
}

try {
    result = client.execute(buildedSearch);
} catch (IOException e) {
    LOGGER.info("Can't found result");
}

如何在搜索生成器上添加范围查询,因为我的对象qb 已经有一个 boolquery,我无法向它添加范围查询。

【问题讨论】:

    标签: java elasticsearch range query-builder elasticsearch-jest


    【解决方案1】:

    试试这个。

    QueryBuilder rangeQuery = QueryBuilders
    .rangeQuery("field")
    .from("2016-01-01||/D")
    .to("2017-01-01||/D")
    .includeLower(true)
    .includeUpper(false);
    
    
    QueryBuilder termsQuery = QueryBuilders.boolQuery()
    .must(QueryBuilders.termsQuery("field1","12"))
    .must(QueryBuilders.termQuery("field2", "abc"))
    .must(QueryBuilders.termQuery("field3", "def"));
    
    
    QueryBuilder qb = QueryBuilders
    .boolQuery()
    .should(rangeQuery)
    .should(termsQuery);
    

    【讨论】:

      【解决方案2】:

      您需要一个范围查询,如下所示:

      QueryBuilder rangeQ = QueryBuilders
                          .rangeQuery("begindate")
                          .from(5)
                          .to(10);
      

      然后将两个查询与一个应该结合起来:

      QueryBuilder qb = QueryBuilders
                          .boolQuery()
                          .should(rangeQ)
                          .should(boolQ);
      

      查看此帖子:How to construct a boolquery dynamically in java api? 了解更多信息。

      【讨论】:

        猜你喜欢
        • 2016-05-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2017-09-18
        • 2022-12-11
        • 1970-01-01
        • 2014-09-02
        相关资源
        最近更新 更多