18

我有几个具有以下格式的 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?

4

2 回答 2

44

我认为在这种情况下,布尔查询是最好的选择。

就像是 :

{
    "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或多或少OR是 s,除了您可以指定should要匹配的最小 s 数(使用minimum_should_match),我认为这个最小值默认为 1(但您可以将其设置为 0,这意味着一个文档should也将返回不匹配的条件)。

如果您想做更复杂的涉及嵌套ANDs 和s 的查询,只需在内部或部分OR嵌套其他 bool 查询。mustshould

此外,当您正在寻找确切的值(id 等)时,也许您可​​以使用term 查询而不是 match 查询,这样可以节省您的分析阶段(如果完全分析了这些字段,这不一定有意义对于身份证)。如果对它们进行了分析,您仍然可以这样做,但前提是您确切知道您的术语是如何存储的(例如,标准分析器将它们存储为小写)。

于 2014-08-28T15:28:37.673 回答
2

如果您使用query_string查询,您的 AND 和 OR 将被 Lucene 库解释为这样。

这允许您搜索

(currentUserId OR currentCustomerId) AND currentComponent

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

于 2014-08-29T08:43:40.283 回答