Elasticsearch查询中的OR和AND运算符

问题描述 投票:10回答:2

我有几个json文档,格式如下: -

    _source: {
            userId: "A1A1",
            customerId: "C1",
            component: "comp_1",
            timestamp: 1408986553,
     }

我想根据以下内容查询文档: -

(( userId == currentUserId) OR ( customerId== currentCustomerId) OR (currentRole ==ADMIN) )  AND component= currentComponent)

我尝试使用SearchSourceBuilder和QueryBuilders.matchQuery,但我无法使用AND和OR运算符放置多个子查询。

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("userId",userId)).sort("timestamp", SortOrder.DESC).size(count);

我们如何使用OR和AND运算符查询elasticsearch?

java elasticsearch jest
2个回答
32
投票

我认为在这种情况下,Bool query是最好的投篮。

就像是 :

{
    "bool" : {
        "must" : { "term" : { "component" : "comp_1" } },
        "should" : [
            { "term" : { "userId" : "A1A1" } },
            { "term" : { "customerId" : "C1" } },
            { "term" : { "currentRole" : "ADMIN" } }
        ],
        "minimum_should_match" : 1
    }
}

这给出了Java:

QueryBuilder qb = QueryBuilders
    .boolQuery()
    .must(termQuery("component", currentComponent))
    .should(termQuery("userId", currentUserId))
    .should(termQuery("customerId", currentCustomerId))
    .should(termQuery("currentRole", ADMIN))
    .minimumNumberShouldMatch(1)

must部分是ANDs,should部分或多或少ORs,除了你可以指定匹配的最小数量shoulds(使用minimum_should_match),默认情况下这个最小值是1我认为(但你可以将它设置为0,意思是将返回不匹配should条件的文档)。

如果你想做更多涉及嵌套ANDs和ORs的复杂查询,只需将其他bool查询嵌套在mustshould部分中。

此外,当您正在寻找精确值(ID等)时,也许您可​​以使用term queries instead of match queries,它可以为您提供分析阶段(如果这些字段完全被分析,这对于ID来说不一定有意义)。如果对它们进行分析,您仍然可以这样做,但前提是您确切知道如何存储术语(standard analyzer stores them lower cased for instance)。


2
投票

如果您使用query_string query,您的AND和OR将由Lucene库解释为。

这允许您搜索

(currentUserId OR currentCustomerId) AND currentComponent

例如。默认情况下,将在所有字段中搜索值。

© www.soinside.com 2019 - 2024. All rights reserved.