弹性搜索查询中的 OR 和 AND 运算符

2022-09-02 02:44:31

我有几个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?


答案 1

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

像这样:

{
    "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)

部分是s,部分是或多或少的s,除了您可以指定要匹配的最小数量(使用),我认为默认情况下,最小值为1(但您可以将其设置为0,这意味着匹配无条件的文档也将返回)。mustANDshouldORshouldminimum_should_matchshould

如果要执行涉及嵌套 s 和 s 的更复杂的查询,只需在内部或部分嵌套其他 bool 查询即可。ANDORmustshould

此外,当您查找确切值(id等)时,也许您可以使用术语查询而不是匹配查询,这样可以节省分析阶段的时间(如果对这些字段进行了分析,则对ids不一定有意义)。如果对它们进行分析,您仍然可以这样做,但前提是您确切地知道您的术语是如何存储的(例如,标准分析器以小写形式存储它们)。


答案 2

如果您使用query_string查询,Lucene 库将按此方式解释您的 ED 和 OR。

这允许您搜索

(currentUserId OR currentCustomerId) AND currentComponent

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


推荐