2015-08-29 17 views
5

Od jakiegoś czasu bawię się z zapytaniem elasticsearch i filtrem, ale nigdy wcześniej nie pracowałem z agregacjami. Pomysł, że możemy zmierzyć agregację za pomocą naszego zapytania, wydaje mi się niesamowity, ale chcę zrozumieć, jak zrobić to poprawnie, aby nie popełnić żadnego błędu. Obecnie wszystkie moje zapytań są zaprojektowane w ten sposób:Elasticsearch: jak zakres agregacji do zapytania i filtrowania?

{ 
    "query": { 

    }, 
    "filter": { 

    }, 
    "from": 0, 
    "size": 60 
} 

teraz, kiedy dodałem kilka wiader agregacji struktura stała się w ten sposób:

{ 
    "aggs": { 
     "all_colors": { 
     "terms": { 
      "field": "color.name" 
     } 
     }, 
     "all_brands": { 
     "terms": { 
      "field": "brand_slug" 
     } 
     }, 
     "all_sizes": { 
     "terms": { 
      "field": "sizes" 
     } 
     } 
    }, 
    "query": { 

    }, 
    "filter": { 

    }, 
    "from": 0, 
    "size": 60 
} 

Jednak wyniki agregacji są zawsze takie same, niezależnie jakie informacje podaję w filtrze.

Teraz, kiedy zmienił strukturę zapytania do czegoś takiego, zaczęło pokazano różne wyniki:

{ 
    "aggs": { 
     "all_colors": { 
     "terms": { 
      "field": "color.name" 
     } 
     }, 
     "all_brands": { 
     "terms": { 
      "field": "brand_slug" 
     } 
     }, 
     "all_sizes": { 
     "terms": { 
      "field": "sizes" 
     } 
     } 
    }, 
    "query": { 
     "filtered": { 
      "query": { 

      }, 
      "filter": { 

      }   
     } 
    }, 
    "from": 0, 
    "size": 60 
} 

Czy to znaczy, będę musiał zmienić strukturę moich zapytań wszędzie do tego nowego przefiltrowanej typu struktury? Czy istnieje inne obejście, które pozwala mi osiągnąć pożądane rezultaty bez zmiany tak dużej ilości kodu?

Również inna rzecz zauważyłem jest to, że jeśli mój brand_slug pole zawiera wiele słów kluczowych, takich jak „Peter Anglii”, a następnie oba te zwracane są w oddzielnych wiadra tak:

{ 
    "buckets": [ 
     { 
      "key": "england", 
      "doc_count": 368 
     }, 
     { 
      "key": "peter", 
      "doc_count": 368 
     } 
    ] 
} 

Skąd mogę mieć pewność, że zarówno one skończyć w tym samym wiadrze tak:

{ 
    "buckets": [ 
     { 
      "key": "peter england", 
      "doc_count": 368 
     } 
    ] 
} 

UPDATE: ta druga część udało mi się osiągnąć przez markę indeksowania, kolor i rozmiary inaczej tak:

"sizes": { 
    "type": "string", 
    "fields": { 
     "raw": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
    } 
} 

Odpowiedz

4

To, co zauważyłeś, jest zgodne z projektem. Spójrz na my answer na podobne pytanie na SO. Zasadniczo, dane wejściowe do sekcji agregacji i filtrów są danymi wyjściowymi sekcji zapytania. Filtered Query jak sugerujesz, to najlepszy sposób na osiągnięcie pożądanych rezultatów. Jest też inny sposób. Możesz użyć Filter Aggregation. Wtedy nie musiałbyś zmieniać kwerendy i sekcje filtrów, ale po prostu kopiuj sekcję filtrów wewnątrz sekcji agregacji, ale moim zdaniem byłaby to przesada i naruszenie ogólnie numeru DRY principle.

+0

dzięki za odpowiedź. Jednak jedną rzecz, która mnie zastanawia, jest to, że mówisz, że zapytanie jest najpierw stosowane, a następnie filtrowane? Po prostu ciekawy, dlaczego nie jest odwrotnie, ponieważ filtry są stosunkowo szybsze i mogą znacznie zmniejszyć liczbę wyników do wykonania dopasowań zapytań później. –

+0

Filtry zostaną zastosowane przed zapytaniem tylko wtedy, gdy są częścią przefiltrowanego zapytania. Więcej informacji można znaleźć na stronie https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html#_filter_strategy. Filtr, o którym tutaj mówimy, jest w rzeczywistości 'post_filter', który jak sugeruje nazwa zostanie zastosowany po wykonaniu zapytania. Więcej informacji można znaleźć na stronie https://www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html. – bittusarkar

+0

ok. więc masz na myśli to, że jeśli zmienię strukturę zapytania na filtrowane zapytanie, mogę również uzyskać poprawę wydajności? –

Powiązane problemy