java Elasticsearch查询中的OR和AND运算符

jaxagkaj  于 2023-06-20  发布在  Java
关注(0)|答案(3)|浏览(161)

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

dxpyg8gm

dxpyg8gm1#

我认为在这种情况下,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部分是AND s,should部分或多或少是OR s,除了您可以指定要匹配的should s的最小数量(使用minimum_should_match),我认为默认情况下最小值为1(但您可以将其设置为0,这意味着也将返回不匹配should条件的文档)。
如果您想执行涉及嵌套AND s和OR s的更复杂的查询,只需在mustshould部分中嵌套其他bool查询。
另外,当你在寻找精确的值(id等)时,也许你可以使用term queries instead of match queries,这样可以省去分析阶段(如果这些字段被分析的话,这对id来说不一定有意义)。如果它们被分析,你仍然可以这样做,但只有当你确切地知道你的术语是如何存储的(例如,标准分析器存储它们的小写)。

xxhby3vn

xxhby3vn2#

如果你使用query_string query,你的AND和OR将被Lucene库解释为这样。
这允许您搜索

(currentUserId OR currentCustomerId) AND currentComponent

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

kmynzznz

kmynzznz3#

下面是一个使用AND、OR和NOT的查询示例:

GET cities/_search
{
  "query": {"bool": {"must": [
    {"bool": {"should": [
      {"bool": {"must": [
        {"match": {"description": "great"}},
        {"match": {"description": "orange"}}
      ]}},
      {"match": {"description": "popular"}}
    ]}},

    {"bool": {"must_not": [
      {"match": {"description": "poor"}}
    ]}},

    {"bool": {"should": [
      {"match": {"city": "London"}},
      {"match": {"city": "Paris"}},
    ]}}
  ]}},
"size": 20,
"from": 0
}

它只在指定的城市中搜索城市,其中描述包括(“伟大”和“橙子”)或“流行”词,但不包括结果,其中“穷人”词找到
must表示ANDshould表示ORmust_not表示NOT
您可以找到here的其他示例:

相关问题