2015-09-01 9 views
6

Nie mogę utworzyć elastycznej agregacji wyszukiwania + filtru do pracy z zagnieżdżonymi polami. Schemat danych (odpowiednia część) jest tak:Agregacja elastyczna wyszukująca nie działa z polami typu zagnieżdżonego

"mappings": { 
    "rb": { 
    "properties": { 
     "project": { 
     "type": "nested", 
     "properties": { 
      "age": { 
      "type": "long" 
      }, 
      "name": { 
      "type": "string", 
      "index": "not_analyzed" 
      } 
     } 
     }  
    } 
    } 
} 

Zasadniczo „rb” obiekt zawiera zagnieżdżone pole o nazwie „projekt”, który zawiera dwa kolejne pola - „nazwa” i „wiek”. Kwerendy biegnę:

"aggs": { 
    "root": { 
    "aggs": { 
     "group": { 
     "aggs": { 
      "filtered": { 
      "aggs": { 
       "order": { 
       "percentiles": { 
        "field": "project.age", 
        "percents": ["50"] 
       } 
       } 
      }, 
      "filter": { 
       "range": { 
       "last_updated": { 
        "gte": "2015-01-01", 
        "lt": "2015-07-01" 
       } 
       } 
      } 
      } 
     }, 
     "terms": { 
      "field": "project.name", 
      "min_doc_count": 5, 
      "order": { 
      "filtered>order.50": "asc" 
      }, 
      "shard_size": 10, 
      "size": 10 
     } 
     } 
    }, 
    "nested": { 
     "path": "project" 
    } 
    } 
} 

Ta kwerenda ma produkować 10 najlepszych projektów (pole project.name), które pasują do filtra datę, posortowane według mediany wieku, ignorując projekty z mniej niż 5 wspomina w bazie danych . Medianę należy obliczyć tylko dla projektów pasujących do filtra (zakres dat).

Pomimo ponad sto tysięcy obiektów w bazie danych, ta kwerenda tworzy pustą listę. Brak błędów, po prostu pusta odpowiedź. Próbowałem go zarówno na ES 1.6 i ES 2.0-beta.

Odpowiedz

7

Mam zreorganizowana zapytanie agregacji trochę i mogę dostać niektóre wyniki wyświetlane. Głównym punktem jest to typ, ponieważ jesteś agregowania wokół typu nested, wyjąłem agregację filter na polu last_updated i przeniósł go w górę hierarchii jako pierwszy agregacji. Potem przychodzi nested agregację na polu project i wreszcie terms i percentile.

To wydaje się działać całkiem dobrze. Proszę spróbować.

{ 
    "size": 0, 
    "aggs": { 
    "filtered": { 
     "filter": { 
     "range": { 
      "last_updated": { 
      "gte": "2015-01-01", 
      "lt": "2015-07-01" 
      } 
     } 
     }, 
     "aggs": { 
     "root": { 
      "nested": { 
      "path": "project" 
      }, 
      "aggs": { 
      "group": { 
       "terms": { 
       "field": "project.name", 
       "min_doc_count": 5, 
       "shard_size": 10, 
       "order": { 
        "order.50": "asc" 
       }, 
       "size": 10 
       }, 
       "aggs": { 
       "order": { 
        "percentiles": { 
        "field": "project.age", 
        "percents": [ 
         "50" 
        ] 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

To działa! Po prostu musiałem zwiększyć shard_size do 100, aby uzyskać 10 wartości wstecz. Czy możesz wyjaśnić, dlaczego mój oryginalny wariant nie zadziałał? Czy jest to ograniczenie w ES, że nie obsługuje filtrów wewnątrz zagnieżdżonych pól? – extesy

+1

Wewnątrz agregacji 'zagnieżdżonej' można odwoływać się tylko do zagnieżdżonych pól. Poza tym lepiej jest najpierw odfiltrować dane oparte na 'last_updated' i dopiero wtedy operować na zagnieżdżonych danych. – Val

+0

@ Val - Czy możesz mi powiedzieć, jak mogę to zrobić w przypadku wiadra wielowartościowego? Oddzielne pytanie - http://stackoverflow.com/questions/43451667/elasticsearch-ordering-aggregation-by-nested-aggregation-on-nested-field –