2015-12-02 3 views
0

Я новичок в Elastic Search (1.7). У меня есть индекс ES версий клиента.Упругий поиск Трудный запрос с группировкой

Каждый клиент имеет уникальный идентификатор (client_id).

В индексе может быть множество версий клиента.

Каждая версия клиента имеет уникальный идентификатор (version_id) для клиента.

Индекс данных Пример:

{ 
    “client_id”: "1", 
    "version_id": "1", 
    “versionCreationDate”: "2015-11-06T10:02:22.597Z", 
    “clientName”: “FirstName LastName” 
} 
…, 
{ 
    “client_id”: "1", 
    "version_id": "n", 
    “versionCreationDate”: … 
    “clientName”: “FirstName LastName” 
}, 
{ 
    “client_id”: "2", 
    "version_id": "1", 
    “versionCreationDate”: … 
    “clientName”: “FirstName LastName” 
}, 
… 
{ 
    “client_id”: "2", 
    "version_id": "n", 
    “versionCreationDate”: … 
    “clientName”: “FirstName LastName” 
}, 
… 
{ 
    “client_id”: "N", 
    "version_id": "1", 
    “versionCreationDate”: … 
    “clientName”: “FirstName LastName” 
}, 
… 
{ 
    “client_id”: "N", 
    "version_id": "n", 
    “versionCreationDate”: … 
    “clientName”: “FirstName LastName” 
} 

Мне нужно найти версии клиента от входных параметров для запроса:

< CLIENTNAME>, < VersionCreationDateMax>.

Версия клиента должна соответствовать < clientName> (с fuzziness = auto). И любая версия должна иметь максимальное значение versionCreationDate для этого клиента, но < = < VersionCreationDateMax>. Таким образом, только одна версия каждого клиента должны быть в результатах поиска (новые, но не более чем < VersionCreationDateMax>)

Пожалуйста, помогите мне найти фильтр/запрос, чтобы сделать это

ответ

0

Вы можете достичь этого с помощью следующего запроса:

  • один range фильтра, чтобы определить максимальную versionCreationDate
  • затем один terms агрегации на client_id поле
  • Наконец, для каждого клиентского ковша один подкатегорий top_hits отсортирован в desc порядке на поле versionCreationDate и возвращает только один документ (т. size: 1)

Вот запрос:

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "range": { 
      "versionCreationDate": { 
      "lt": "2015-12-02T00:00:00.000Z" 
      } 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "clients": { 
     "terms": { 
     "field": "client_id" 
     }, 
     "aggs": { 
     "latest": { 
      "top_hits": { 
      "sort": [ 
       { 
       "versionCreationDate": { 
        "order": "desc" 
       } 
       } 
      ], 
      "size": 1 
      } 
     } 
     } 
    } 
    } 
} 
+0

Похоже, это работает. Brilliant! –

+0

Ницца, рад, что я мог бы помочь! – Val

+0

Val, это работает, но _score только в разделе результатов «хитов». И это == null в разделе «агрегации». Зачем? Как сделать ES для return_score в разделе агрегации? –