【问题标题】:How to AND multiple setQuery in elasticsearch using java?如何使用java在elasticsearch中AND多个setQuery?
【发布时间】:2018-12-21 20:04:55
【问题描述】:

我正在尝试使用 elasticsearch 为搜索过滤器创建查询。我创建了根据搜索词、价格范围和品牌列表显示结果的查询。搜索词和价格范围显示的结果是正确的,但是当提供品牌列表时,会显示与所选品牌相关的所有结果。

我想要搜索词、价格和品牌的结果

这是我的查询

BoolQueryBuilder query = QueryBuilders.boolQuery();
for (String key : brands) {
    query.must(QueryBuilders.matchQuery("brand", key));
}

SearchResponse searchresponse = client
        .prepareSearch("product")
        .setTypes("product")
        .setQuery(
                QueryBuilders.matchPhraseQuery("name", pSearchTerm))
        .setPostFilter(
                QueryBuilders.rangeQuery("unit_price").from(min)
                        .to(max))
        .setQuery(query).setExplain(true)
        .execute().actionGet();

我在这里做错了什么?

【问题讨论】:

    标签: java spring-boot elasticsearch


    【解决方案1】:

    您有两个setQuery() 调用,因此第二个调用覆盖第一个。您需要将所有约束组合到一个查询中,如下所示:

    // brand list
    BoolQueryBuilder query = QueryBuilders.boolQuery();
    for (String key : brands) {
        query.must(QueryBuilders.matchQuery("brand", key));
    }
    
    // search term
    query.must(QueryBuilders.matchPhraseQuery("name", pSearchTerm));
    
    // price range
    query.filter(QueryBuilders.rangeQuery("unit_price").from(min).to(max));
    
    SearchResponse searchresponse = client
        .prepareSearch("product")
        .setTypes("product")
        .setQuery(query)
        .setExplain(true)
        .execute().actionGet();
    

    【讨论】:

    • 这是很好的解释@Val。不过,我更喜欢先设置过滤器。对这些语句的顺序有什么想法吗?
    • 这没什么区别,ES 会确保先过滤文档集,然后运行必须约束中存在的所有匹配项。如果它在视觉上对您有帮助,您可以将 filter() 调用移到 boolQuery() 调用下方。
    • 酷,很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2016-09-08
    • 2020-07-11
    • 2015-08-16
    • 2016-10-29
    • 1970-01-01
    相关资源
    最近更新 更多