2016-08-03 9 views
7

У меня есть случай использования, в котором у меня есть данные, какВернуться уникальные результаты в elasticsearch

{ 
    name: "John", 
    parentid": "1234", 
    filter: {a: '1', b: '3', c: '4'} 
}, 
{ 
    name: "Tim", 
    parentid": "2222", 
    filter: {a: '2', b: '1', c: '4'} 
}, 
{ 
    name: "Mary", 
    parentid": "1234", 
    filter: {a: '1', b: '3', c: '5'} 
}, 
{ 
    name: "Tom", 
    parentid": "2222", 
    filter: {a: '1', b: '3', c: '1'} 
} 

ожидаемых результатов:

bucket:[{ 
    key: "2222", 
    hits: [{ 
     name: "Tom" ... 
    }, 
    { 
     name: "Tim" ... 
    }] 
}, 
{ 
    key: "1234", 
    hits: [{ 
     name: "John" ... 
    }, 
    { 
     name: "Mary" ... 
    }] 
}] 

Я хочу вернуть уникальный документ по parentid. Хотя я могу использовать верхнюю агрегирование, но я не могу рисовать ведро. Поскольку есть больше шансов, что parentid отличается от этого. Таким образом, массив майков будет большим, и я хочу показать их все, но разбив их на страницы.

+0

[Поддержка пейджинга для агрегации] (https://github.com/elastic/elasticsearch/issues/4915) еще не реализована. Пожалуйста, покажите пример ответа, который вы хотели бы получить, возможно, есть еще один способ получить то, что вам нужно. – Val

+0

Я обновил ожидаемый результат, теперь моя длина ковша будет намного больше. так как я подхожу к этой проблеме. –

+0

Кажется, вы агрегируете «parentid», а не «атрибуты фильтра», как указано в вашем вопросе. Ваша цель не очень ясна, пожалуйста, не забудьте обновить свой вопрос, чтобы точно отразить то, что вы хотите. – Val

ответ

1

Нет прямого способа сделать это. Но вы можете выполнить следующие шаги, чтобы получить желаемый результат.

Шаг 1. Вы должны знать все parentid. Эти данные можно получить, выполнив простой terms aggregation (Подробнее here) в поле parentid и вы получите только список parentid, а не документы, соответствующие этому. В итоге у вас будет меньший массив, чем вы в настоящее время ожидаете.

{ 
    "aggs": { 
    "parentids": { 
     "terms": { 
     "field": "parentid", 
     "size": 0 
     } 
    } 
    } 
} 

size: 0 необходим, чтобы вернуть все результаты. Подробнее here.

ИЛИ

Если вы уже знаете, список всех parentid, то вы можете сразу перейти к шагу 2.

Шаг 2. Fetch связанные документы по фильтрации документов по parentid и здесь вы можете применить нумерацию.

{ 
    "from": 0, 
    "size": 20, 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "term": { 
      "parentid": "2222" 
     } 
     } 
    } 
    } 

} 

from и size используются для нумерации страниц, так что вы можете цикл по parentid в списке и получать все соответствующие документы.

-1

Если вы просто ищете для всех имен, сгруппированных по родительским идентификатором, вы можете использовать ниже запрос:

{ 
     "query": { 
     "match_all": {} 
     },"aggs": { 
     "parent": { 
      "terms": { 
      "field": "parentid", 
      "size": 0 
      },"aggs": { 
      "NAME": { 
       "terms": { 
       "field": "name", 
       "size": 0 
       } 
      } 
      } 
     } 
     },"size": 0 
    } 

Если вы хотите, чтобы весь документ, сгруппированные по parentdId, это будет процесс 2 шага, как объяснено Сумит выше, и вы можете использовать там разбивку на страницы.

Агрегирование не дает вам доступа ко всем документам/документам в результате agg, поэтому это должно быть двухэтапный процесс.

+0

Есть ли способ разбиения на страницы в суб-агрегации? –

+0

@SumitKumar Обновлен мой ответ. Из вопроса было похоже, что он ищет имена только для всех родительских идентификаторов. В настоящее время нет возможности разбивать страницы на результат агрегации. – skgemini

Смежные вопросы