2015-08-20 2 views
2

Есть ли способ заставить Elasticsearch рассматривать последовательности-пробелы при группировке?Группировка последовательных документов с Elasticsearch

При условии, что следующие данные объемной импортирован в Elasticsearch:

{ "index": { "_index": "test", "_type": "groupingTest", "_id": "1" } } 
{ "sequence": 1, "type": "A" } 
{ "index": { "_index": "test", "_type": "groupingTest", "_id": "2" } } 
{ "sequence": 2, "type": "A" } 
{ "index": { "_index": "test", "_type": "groupingTest", "_id": "3" } } 
{ "sequence": 3, "type": "B" } 
{ "index": { "_index": "test", "_type": "groupingTest", "_id": "4" } } 
{ "sequence": 4, "type": "A" } 
{ "index": { "_index": "test", "_type": "groupingTest", "_id": "5" } } 
{ "sequence": 5, "type": "A" } 

Есть ли способ, чтобы запросить эту информацию таким образом, что

  • документы с порядковым номером 1 и 2 идут к одной группе выходов,
  • документ с порядковым номером 3 переходит на другой, а
  • документы с порядковым номером 4 и 5 переходят в третью группу?

... учитывая тот факт, что последовательность типа А прервана элементом типа B (или любым другим элементом, который не является типом A)?

Я хотел бы результат ведра выглядеть примерно так (имя и значение sequence_group могут отличаться друг от друга - просто пытается проиллюстрированной логики):

"buckets": [ 
    { 
     "key": "a", 
     "sequence_group": 1, 
     "doc_count": 2 
    }, 
    { 
     "key": "b", 
     "sequence_group": 3, 
     "doc_count": 1 
    }, 
    { 
     "key": "a", 
     "sequence_group": 4, 
     "doc_count": 2 
    } 
] 

Существует хорошее описание проблемы и некоторые SQL решение подходов - https://www.simple-talk.com/sql/t-sql-programming/the-sql-of-gaps-and-islands-in-sequences/. Я хотел бы знать, есть ли решение для поиска elasticsearch.

ответ

0

Вы всегда можете создать агрегирование терминов, а затем применить агрегирование хитов вершины, чтобы получить это.

{ 
    "aggs": { 
    "types": { 
     "terms": { 
     "field": "type" 
     }, 
     "aggs": { 
     "groups": { 
      "top_hits": { 
      "size": 10 
      } 
     } 
     } 
    } 
    } 
} 
+0

Агрегация Top hits, похоже, не решает проблему. Используя агрегацию, которую вы предложили, вы просто извлекаете два ведра: один для типа «А» и один для типа «В». Я не вижу, как это решает проблему рассмотрения разрывов последовательностей. – yaccob