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"
}
}
}
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. –
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
ok. więc masz na myśli to, że jeśli zmienię strukturę zapytania na filtrowane zapytanie, mogę również uzyskać poprawę wydajności? –