Как выполнять логические запросы в ElasticSearch с помощью Java Api?

Я пытаюсь отправить логический запрос к моему эластичному поиску, который отфильтровывает документы. Как я могу фильтровать логические выражения, такие как (A AND B AND C) AND (D OR E OR F) AND G с помощью BooleanQueryBuilder Api в Java? Я пробовал с методом фильтра, но я не получаю никаких результатов. Например:

Представьте, что A, B, C, D, E, F, G — это события, где атрибут «имя» должен соответствовать, например, «Робин».

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;

}

Я знаю, что этот пример не очень хорош, но я надеюсь, что вы можете мне помочь! Спасибо!


person Robatz Rabauke    schedule 25.04.2019    source источник
comment
Это может не отвечать на ваш вопрос напрямую, но я бы попытался посмотреть, как выглядит запрос, который отправляется в Elastic, и какой ответ вы получаете. Я всегда использую Fiddler для подобных вещей. Еще одна идея: вы можете попробовать использовать Elastic QueryString (elastic.co/guide/en/elasticsearch/reference/current/)   -  person Neil Varnas    schedule 26.04.2019


Ответы (1)


Это один?

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;
}
person SuperPirate    schedule 26.04.2019
comment
Привет, спасибо за ответ! Я попробовал ваш код, но все равно получаю результаты, где name != robin. Я думаю, это исходит из оценки. Дело в том, что я не хочу, чтобы счет учитывался. Мне просто нужны документы, которые действительно соответствуют заданному логическому выражению. Вот почему я подумал, что метод фильтрации должен быть правильным, а не обязательными и обязательными методами. - person Robatz Rabauke; 26.04.2019