Elasticsearch查找所有已发送的消息'但没有打开'

时间:2015-04-14 08:14:07

标签: elasticsearch elasticsearch-dsl

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

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|

2 个答案:

答案 0 :(得分:1)

使用单个查询会很困难,因为您的数据已经标准化,因此需要自己加入,而ES中不存在AFAIK。我认为有两种解决方案:

  1. 使用操作的嵌套字段取消规范化数据。
  2. 使用两个查询:在第一个查询中,您将检索已发送的所有邮件。对于第二个查询,您可以使用第一个查询中的 message_ids ,并使用bool过滤器合并ids filterterm filter以获取未打开的内容。

答案 1 :(得分:0)

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

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