如何在Java API中使用ElasticSearch进行布尔查询?

8

我试图通过ElasticSearch发送一个bool查询,它会过滤掉一些文档。在Java中使用BooleanQueryBuilder Api,如何过滤布尔表达式(A AND B AND C) AND (D OR E OR F) AND G? 我已经尝试使用filter方法,但是没有返回结果。例如:

假设A、B、C、D、E、F、G都是事件,这些事件的属性"name"必须与"Robin"匹配。

private QueryBuilder getQueryBuilder() {

        BoolQueryBuilder boolQueryBuilder1 = QueryBuilders
                .boolQuery()
                .filter(QueryBuilders.matchQuery(D).operator(Operator.OR))
                .filter(QueryBuilders.matchQuery(E).operator(Operator.OR))
                .filter(F);

        BoolQueryBuilder boolQueryBuilder2 = QueryBuilders
                .boolQuery()
                .filter(QueryBuilders.matchQuery(A).operator(Operator.AND))
                .filter(QueryBuilders.matchQuery(B).operator(Operator.AND))
                .filter(QueryBuilders.matchQuery(C));

        BoolQueryBuilder boolQueryBuilder3 = QueryBuilders
                .boolQuery()
                .filter(G);

        BoolQueryBuilder boolQueryBuilder = QueryBuilders
                .boolQuery()
                .filter(boolQueryBuilder1)
                .filter(boolQueryBuilder2)
                .filter(boolQueryBuilder3);

        return boolQueryBuilder;

}

我知道这个例子不是很好,但希望你能帮助我!谢谢!


这可能并不能直接回答你的问题,但我建议你尝试查看一下发送到 Elastic 的请求和返回的响应是什么样子的。我通常使用 Fiddler 来做这种事情。另一个想法是,你可以尝试使用 Elastic QueryString(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-dsl-query-string-query)。 - nlv
1个回答

10

这是吗?

private static QueryBuilder getQueryBuilder() {
    //condition
    MatchQueryBuilder A = QueryBuilders.matchQuery("content", "A");
    MatchQueryBuilder B = QueryBuilders.matchQuery("content", "B");
    MatchQueryBuilder C = QueryBuilders.matchQuery("content", "C");
    MatchQueryBuilder D = QueryBuilders.matchQuery("content", "D");
    MatchQueryBuilder E = QueryBuilders.matchQuery("content", "E");
    MatchQueryBuilder F = QueryBuilders.matchQuery("content", "F");
    MatchQueryBuilder G = QueryBuilders.matchQuery("name", "Robin");
    //Maybe you should use TermQuery
    //TermQueryBuilder G = QueryBuilders.termQuery("name", "Robin");


    //1.(A AND B AND C)
    BoolQueryBuilder query1 = QueryBuilders.boolQuery();
    query1.must(A).must(B).must(C);

    //2.(D OR E OR F)
    BoolQueryBuilder query2 = QueryBuilders.boolQuery();
    query2.should(D).should(E).should(F);

    //3.Last
    BoolQueryBuilder lastQuery = QueryBuilders.boolQuery();
    lastQuery.must(query1).must(query2).must(G);
    
    //use filter
    BoolQueryBuilder filterBuiler = QueryBuilders.boolQuery().filter(lastQuery);
    return filterBuiler;
}

嗨,谢谢回复!我尝试了您的代码,但我仍然得到了名称不等于robin的结果。我认为这是来自分数的原因。问题是,我不想考虑分数。我只需要真正匹配给定布尔表达式的文档。这就是为什么我认为过滤方法应该是正确的选择,而不是必须和应该的方法。 - Robatz Rabauke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接