Elasticsearch:如果存在其他记录,则排除结果

时间:2015-03-29 06:20:46

标签: elasticsearch elasticsearch-dsl

我有以下弹性搜索索引结构:

id|action|user_id|message_id
 1| click|      1|         1
 2|  open|      1|         1
 3| click|      2|         1
 4|  open|      2|         1
 5| click|      1|         2
 6| click|      1|         2
 7| click|      3|         2

想法是插入带有操作的记录:'打开'对于每个user_id-message_id,缺少带有操作的记录:'打开'。为此,我需要获得所有user_id-message_id关联,只要他们没有采取行动:' open'已经

是否可以创建一个返回不同user_id-message_id记录的查询,不包括user_id-message_id,如果表中还包含action with record:open和相同的user_id-message_id关联?

预期结果:

 5| click|      2|         1
 7| click|      3|         2

1 个答案:

答案 0 :(得分:1)

嗯,您可以通过查询和topN hits聚合方面的小脚本来实现这一点。

{
  "query": {
    "filtered": {
      "filter": {
        "not": {
          "term": {
            "action": "open"
          }
        }
      }
    }
  },
  "aggs": {
    "keys": {
      "terms": {
        "script": "doc['message_id'].value + doc['user_id'].value"
      },
      "aggs": {
        "results": {
          "top_hits": {
            "size": 10
          }
        }
      }
    }
  }
}