聚合或筛选

brccelvz  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(2)|浏览(352)

我有一个jbpm用户任务的索引。每个用户任务都有 id , actualOwner 以及 actualOwner.keyword , potentialOwners 以及 potentialOwners.keyword ,和 processId 领域。
我需要这个聚合:某个用户的每个进程的用户任务数。如果用户任务是 actualOwner 或者 potentialOwner 就是那个用户。在某些状态下。
这似乎很简单,但我写不出来。我试试这个:

POST jbpm-tasks/_search?size=1000
{
  "query": {
    "bool": {
      "should": [
        { 
          "term": {
            "actualOwner.keyword": {
              "value": "vasya"
            }
          }
        },
        {
          "term": {
            "potentialOwners.keyword": {
              "value": "vasya"
            }
          }
        }
      ],
      "must": [
        {
          "terms": {
            "status.keyword": [
              "Created",
              "Reserved",
              "InProgress",
              "Ready"
            ]
          }
        }
      ]
    }
  },
  "aggs": {
    "byProcesses": {
      "terms": { "field": "processId.keyword", "size": 1000000 } 
    }
  }
}

据我所知,查询不过滤,它只计算分数。所以,对于这个查询真的不管用户登录,对于 vasya 还有。例如, fedya 请求返回相同的聚合结果(任务的分数不同,但现在不感兴趣)。
我不明白如何为多个过滤器编写过滤器聚合 OR 以及 AND 公式。在所有的例子中总是一个领域。。。
如何正确编写此查询?

fnvucqvd

fnvucqvd1#

你用哪个版本?不同的版本有不同的语法。
你说得对, minimum_should_match=1 就是这样。如果bool查询不包含must或filter子句,则默认 minimum_should_match 值为1时,查询的行为与您最初理解的一样。
否则,默认 minimum_should_match 值为0,表示 should 与…不同的条款 OR , should 子句不过滤任何文档。

POST jbpm-tasks/_search?size=1000
{
  "query": {
    "bool": {
      "should": [
        { 
          "term": {
            "actualOwner.keyword": {
              "value": "vasya"
            }
          }
        },
        {
          "term": {
            "potentialOwners.keyword": {
              "value": "vasya"
            }
          }
        }
      ],
      "must": [
        {
          "terms": {
            "status.keyword": [
              "Created",
              "Reserved",
              "InProgress",
              "Ready"
            ]
          }
        },
      ],
      "minimum_should_match" : 1
    }
  },
  "aggs": {
    "byProcesses": {
      "terms": { "field": "processId.keyword", "size": 1000000 } 
    }
  }
}
xzlaal3s

xzlaal3s2#

如果您不需要按相关性得分对数据进行排序,那么最好使用 filter . 此外,如果您只需要使用聚合部分的数据,那么设置 size:0 使elasticsearch不返回任何帖子,只返回aggs结果。在我看来,以下查询可以为您提供更好的性能:

{
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "status.keyword": [
              "Created",
              "Reserved",
              "InProgress",
              "Ready"
            ]
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "actualOwner.keyword": {
                    "value": "vasya"
                  }
                }
              },
              {
                "term": {
                  "potentialOwners.keyword": {
                    "value": "vasya"
                  }
                }
              }
            ],
            "minimum_should_match": 1
          }
        }
      ]
    }
  },
  "aggs": {
    "byProcesses": {
      "terms": {
        "field": "processId.keyword",
        "size": 1000000
      }
    }
  }

总的来说,将大量数据设置为聚合的大小会使其非常繁重。如果您想查看所有来自聚合的数据,那么使用复合聚合链接将是一个不错的选择。

相关问题