Elasticsearch: исключить результаты, если существует другая запись

У меня есть следующая структура индекса elasticsearch:

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, только если они уже не имеют действия: «открыть».

Можно ли создать запрос, который возвращает отдельные записи user_id-message_id, за исключением user_id-message_id, если в таблице также есть запись с действием: открыть и той же ассоциацией user_id-message_id?

Ожидаемый результат:

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

person Anton    schedule 29.03.2015    source источник
comment
возможный дубликат ElasticSearch, возвращающий только документы с уникальным значением   -  person bittusarkar    schedule 29.03.2015
comment
Это на самом деле другое. Я отредактировал вопрос.   -  person Anton    schedule 29.03.2015


Ответы (1)


Что ж, вы можете добиться этого с помощью небольшого сценария в терминах запроса и topN хитов агрегация.

{
  "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
          }
        }
      }
    }
  }
}
person Vineeth Mohan    schedule 29.03.2015
comment
Кажется, вы просто фильтруете все действия: «открываете» записи. Возможно, мой вопрос был не ясен. Я отредактировал это. Я не хочу {action: 'click', user_id: 1, message_id: 1} в результатах, если у меня уже есть {action:'open', user_id: 1, message_id: 1} в индексе. - person Anton; 29.03.2015