2015-03-06 14 views
12

Mam zestaw 2,8 miliona dokumentów z zestawami znaczników, które wyszukuję za pomocą ElasticSearch, ale wiele z tych dokumentów można zgrupować według jednego identyfikatora. Chcę przesyłać zapytania do moich danych przy użyciu tagów, a następnie agregować je według identyfikatora, który się powtarza. Często moje wyniki wyszukiwania zawierają dziesiątki tysięcy dokumentów, ale chcę tylko zebrać 100 najlepszych wyników wyszukiwania. Jak mogę ograniczyć agregację do tylko 100 najlepszych wyników z zapytania? Można ustawić wartość parametruLimit agregacji ElasticSearch do najlepszych wyników w zapytaniach n

+0

Czy masz przykład zapytania i agregacji? –

+0

Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? – anubina

Odpowiedz

0

w celu zdefiniowania liczby zawinięć terminów z ogólnej listy warunków.

Domyślnie węzeł koordynujący proces wyszukiwania zażąda od każdego odłamka dostarczenia własnego segmentu o maksymalnym rozmiarze, a gdy wszystkie odłamki odpowiedzą, zmniejszy wyniki do ostatecznej listy, która następnie zostanie zwrócona do klienta. Oznacza to, że jeśli liczba unikatowych terminów jest większa niż rozmiar, zwrócona lista jest nieznacznie wyłączona i nie jest dokładna (może się zdarzyć, że termin liczy się w niewielkim stopniu i może to być nawet termin, który powinien znajdować się w najwyższym rozmiarze wiadra nie zwrócono).

Jeśli ustawione na 0, rozmiar zostanie ustawiony na Integer.MAX_VALUE.

Oto przykładowy kod, aby powrócić TOP 100:

{ 
"aggs" : { 
    "products" : { 
     "terms" : { 
      "field" : "product", 
      "size" : 100 
        } 
       } 
     } 
} 

Można odwołać się do this aby uzyskać więcej informacji.

+7

To nie odpowiada na pytanie OP. Wymagane jest agregowanie na podstawie najlepszych wyników zapytania n z zapytania wyszukiwania. Parametr 'size' określa tylko liczbę zwróconych znaczników agregacji. Zakres nadal obejmuje wszystkie dokumenty pasujące do kryteriów zapytania. – bittusarkar

+0

Dzięki, ale dokładnie to, co @barkar powiedział. –

-2

Można użyć parametru min_doc_count

{ 
"aggs" : { 
    "products" : { 
     "terms" : { 
      "field" : "product", 
      "min_doc_count" : 100 
        } 
       } 
     } 
} 
+0

To nie odpowiada na pytanie OP. Zwróci wiaderka, które mają 100 wpisów aleastów, ale nie są ograniczone do 100 najlepszych wyników. – Rahul

3

Sampler Aggregation:

filtrowanie agregację wykorzystywane w celu ograniczenia przetwarzania dowolnej agregacji Sub do próbki dokumentów najwyższej punktacji.

"aggs": { 
    "bestDocs": { 
     "sampler": { 
      // "field": "<FIELD>", <-- optional, Controls diversity using a field 
       "shard_size":100 
     }, 
     "aggs": { 
       "bestBuckets": { 
       "terms": { 
         "field": "id" 
        } 
       } 
     } 
     } 
    } 

To zapytanie ograniczy agregację sub do Top 100 dokumenty z wyniku, a następnie wiadro ich ID.

Opcjonalnie można użyć ustawień field or script and max_docs_per_value w celu kontrolowania maksymalnej liczby dokumentów zebranych na dowolnym fragmencie, który ma wspólną wartość.

+0

Czy to nie próbka agregacji dokładnie to, czego szuka OP? –

+0

Dzięki, zaktualizowałem odpowiedź :) – Rahul

Powiązane problemy