2016-09-27 4 views
0

У меня есть один индекс поиска elasticsearch, в котором у меня так много записей. Существует имя пользователя поля, я хочу, чтобы получить последнюю 1 должность каждого пользователя при пропускании через запятую значения, пример ::Elasticsearch одна запись для одного совпадающего запроса

джон, шахид, микрофон, джоли

и я хотим последние 1 сообщений каждого имени пользователя. Как я могу это сделать? Я могу сделать это, пропустив одно имя пользователя одновременно, но он ударит так много HTTP-запросов. Я хочу сделать это по одному запросу.

ответ

0

Вы можете использовать фильтрованную terms агрегации в сочетании с top_hits один для того, чтобы добиться того, что вам нужно:

{ 
    "size": 0, 
    "query": { 
    "bool": { 
     "filter": { 
     "terms": { 
      "username": [ "john", "shahid", "mike", "jolie" ] 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "usernames": { 
     "filter": { 
     "terms": { 
      "username": [ "john", "shahid", "mike", "jolie" ] 
     } 
     }, 
     "aggs": { 
     "by_username": { 
      "terms": { 
      "field": "username" 
      }, 
      "aggs": { 
      "top1": { 
       "top_hits": { 
       "size": 1, 
       "sort" : {"created_date" : "desc"} 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Этот запрос почти близок к моему требованию, но это дает самую старую запись каждого имени пользователя. Мне нужна последняя запись. Как сортировать в порядке desc created_date? –

+0

Я обновил свой ответ. – Val

+0

Теперь все работает отлично. Я только изменил bool ": {" filter ": {to bool": "must": [{"query_string": {в вашем коде, потому что он выдавал ошибку. –

0

Этот запрос может предоставить вам все сообщения этих 4 идентификаторов, отсортированные по post_date в порядке убывания. Вы можете обрабатывать эти данные, чтобы получить результат.

{ 
     "sort" : [ 
     { "post_date" : {"order" : "desc"}} 
     ], 
     "query" : { 
     "filtered" : { 
      "filter" : { 
      "terms" : { 
       "username" : ["john","shahid","mike","jolie] 
      } 
      } 
     } 
     } 
    } 
+0

Этого запрос дает 20 записей для «микрофона», но без каких-либо записей для других пользователей, Мне нужно всего 4 записи, так как есть 4 имени пользователя, 1 запись для каждого пользователя. –