0

我有以下弹性搜索索引数据:

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

如何找到所有“未打开”的消息?预期结果:

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

2 回答 2

1

使用单个查询将很难做到这一点,因为您的数据已标准化,因此需要对其自身进行连接,而 AFAIK 在 ES 中实际上是不可能的。我认为有两种解决方案:

  1. 使用嵌套字段对数据进行非规范化操作
  2. 使用两个查询:在第一个查询中,您检索所有已传递的消息。对于第二个查询,您使用第一个查询中的message_ids并使用 bool 过滤器将 anids filter和 a组合起来term filter以获取未打开的查询。
于 2015-04-14T08:41:43.010 回答
0

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

GET index1/type1/_search
{
  "size": 10,
  "query": {
    "filtered": {
      "filter": {
        "not": {
          "filter": {
            "term": {
              "action": {
                "value": "opened"
              }
            }
          }
        }
      }
    }
  }
}
于 2015-04-14T17:49:20.373 回答