Elasticsearch 查找 'delivered' 但不是 'opened' 的所有消息

Elasticsearch find all messages that were 'delivered' but not 'opened'

我有以下elasticsearch索引数据:

id|message_id|   action|
 1|         1|delivered|
 2|         1|   opened|
 3|         2|delivered|
 4|         3|delivered|
 5|         4|delivered|
 6|         5|   opened|

如何查找所有 'not opened' 条消息? 预期结果:

id|message_id|   action|
 3|         2|delivered|
 4|         3|delivered|

这对于单个查询来说会很困难,因为您的数据是规范化的,因此需要对自身进行连接,而 AFAIK 在 ES 中实际上是不可能的。我认为有两种解决方案:

  1. 使用 action 的嵌套字段对数据进行反规范化。
  2. 使用两个查询:在第一个查询中,您检索 已发送 的所有消息。对于第二个查询,您使用第一个查询中的 message_ids 并使用 bool 过滤器组合 ids filterterm filter 以获得那些未打开。

使用过滤器。这是一个例子:

GET index1/type1/_search
{
  "size": 10,
  "query": {
    "filtered": {
      "filter": {
        "not": {
          "filter": {
            "term": {
              "action": {
                "value": "opened"
              }
            }
          }
        }
      }
    }
  }
}