Эластичные строки поиска по столбцу

У меня есть документы в ElasticSearch, подобные этому. Я хочу выполнить поиск и получить результат, подобный сводному серверу sql. Но я не знаю, как я могу это сделать.

Name | Year | Gear
C30    2012    A
C30    2011    M
C30    2014    M
C30    2015    A
C30    2013    A
V40    2012    A
V40    2013    M
V40    2015    A
S60    2012    M
S60    2011    A

Когда я ищу «C30 A», я хочу показывать такие данные.

Name | Years
C30    2012,2015,2013 

Как я могу это сделать ? в ес можно?


person user1924375    schedule 10.02.2015    source источник
comment
Не могли бы вы уточнить, проиндексированы ли ваши данные в том формате, который вы указали выше? Это означает, что в каждом документе есть поля «Имя», «Год» и «Снаряжение»?   -  person Manolis    schedule 10.02.2015
comment
Вы должны иметь возможность использовать агрегаты для этого. В этом случае агрегация фильтров с фильтром по имени и снаряжению и агрегация вложенных терминов по году должна помочь. Это даст вам список наиболее частых лет для данного имени и снаряжения.   -  person Jilles van Gurp    schedule 10.02.2015
comment
@Manolis мои данные проиндексированы в Elasticsearch   -  person user1924375    schedule 10.02.2015


Ответы (1)


Если ваши данные уже проиндексированы, как показано (это означает: каждый документ имеет поля Имя, Год и Механизм), то правильный запрос вернет вам список документов этого типа.

Пример такого запроса приведен ниже (доступны дополнительные параметры - дополнительную информацию о запросе dsl см. здесь - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html).

"query": {
    "bool": {
        "must": [
           {"match": { "Name": "C30" }},
           {"match": { "Gear": "A" }}               
        ]
    }
}

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

Однако, если ваши данные еще не проиндексированы или вы не хотите менять свою политику, я бы предложил денормализовать ваши данные и проиндексировать их в форме, которая вам больше всего подходит. Я предлагаю индексировать документ, подобный приведенному ниже:

public class ObjectToIndex{
    public string Name;
    public string Gear;
    public List<string> Years;
}

Теперь ваши данные будут выглядеть

Name | Gear | Years
C30     A   2012,2015,2013
C30     M   2011,2014
V40     A   2012,2015
V40     M   2013
S60     A   2011
S60     M   2012

В этом случае запрос, подобный приведенному выше, вернет вам документ, например:

C30, A,  2012,2015,2013
person Manolis    schedule 10.02.2015