2013-01-22 10 views

Odpowiedz

18

Możesz wpisać terms facet w polu "pełna_nazwa". Jednak aby to zrobić poprawnie, musisz upewnić się, że nie jest tokenizacją podczas indeksowania, w przeciwnym razie każdy wpis w elemencie będzie innym terminem, który jest częścią treści pola. Najprawdopodobniej musisz skonfigurować go jako "not_analyzed" w swoim mapowaniu. Jeśli również wyszukujesz go i nadal chcesz tokenizować, możesz go po prostu zindeksować na dwa różne sposoby, używając multi field.

Należy również wziąć pod uwagę, że w zależności od liczby unikalnych pojęć, które są częścią pola nazwa_pełna, operacja ta może być kosztowna i wymagać sporo pamięci.

12

Dla Elasticsearch 1.0 i później można wykorzystać terms aggregation aby to zrobić,

DSL zapytania:

{ 
    "aggs": { 
    "NAME": { 
     "terms": { 
     "field": "", 
     "size": 10 
     } 
    } 
    } 
} 

Prawdziwy przykład:

{ 
    "aggs": { 
    "full_name": { 
     "terms": { 
     "field": "authors", 
     "size": 0 
     } 
    } 
    } 
} 

Następnie można uzyskać wszystkie unikatowe wartości z pola authors. size = 0 oznacza nie ograniczenie liczby terminów (wymaga to, aby es było 1.1.0 lub nowsze).

Response:

{ 
    ... 

    "aggregations" : { 
     "full_name" : { 
      "buckets" : [ 
       { 
        "key" : "Ken", 
        "doc_count" : 10 
       }, 
       { 
        "key" : "Jim Gray", 
        "doc_count" : 10 
       }, 
      ] 
     } 
    } 
} 

zobaczyć Elasticsearch terms aggregations.

+0

co robi FULL_NAME oznacza? – neustart47

+2

@ neustart47 full_name to tylko nazwa agregacji –

4

Istniejące odpowiedzi nie działa na mnie w Elasticsearch 5.X, z następujących powodów:

  • Musiałem tokenize moje wejście while indeksowania.
  • "size": 0 nie można przeanalizować, ponieważ "[rozmiar] musi być większy niż 0."
  • "Fielddata is disabled on text fields by default." Oznacza to, że domyślnie nie można wyszukiwać w polu full_name. Jednak do agregacji można użyć niezanalizowanego pola keyword.

Rozwiązanie 1: użyj Scroll API. Działa poprzez utrzymywanie kontekstu wyszukiwania i wysyłanie wielu żądań, za każdym razem zwracając kolejne partie wyników. Jeśli korzystasz z Pythona, moduł elasticsearch ma scan() helper function, który obsługuje przewijanie i zwraca wszystkie wyniki.

Rozwiązanie 2: użyj Search After API. Jest podobny do Scroll, ale zamiast tego utrzymuje kontekst wyszukiwania za pomocą kursora na żywo. Dzięki temu jest bardziej wydajny w przypadku zapytań w czasie rzeczywistym.

+0

Nie jestem pewien, czy działa to w przypadku problemu "size": 0, ponieważ domyślne, o ile widzę z dokumentów, jest 10 ... – Trejkaz

+0

@Trejkaz Thanks; Zaktualizowałem swoją odpowiedź. –

0

Praca dla Elasticsearch 5.2.2

curl -XGET http://localhost:9200/articles/_search?pretty -d ' 
{ 
    "aggs" : { 
     "whatever" : { 
      "terms" : { "field" : "yourfield", "size":10000 } 
     } 
    }, 
    "size" : 0 
}' 

W "size":10000 środki dostać (co najwyżej) 10000 unikalnych wartości. Bez tego, jeśli masz więcej niż 10 unikalnych wartości, zwracane jest tylko 10 wartości.

"size":0 oznacza, że ​​w rezultacie "hits" nie będzie zawierać żadnych dokumentów. Domyślnie zwracanych jest 10 dokumentów, których nie potrzebujemy.


referencyjny: bucket terms aggregation

Należy również pamiętać, według this page, aspekty zostały zastąpione przez agregacji w Elasticsearch 1.0, które są rozszerzeniem aspektach.

0

Intuicja: W SQL żargonie:

Select distinct full_name from authors;

jest równoważna

Select full_name from authors group by full_name;

Tak, możemy użyć składni grupy/kruszywa w ElasticSearch znaleźć odrębne wpisy .

przyjęto następujące założenia jest struktura przechowywane w elastycznym wyszukiwania:

[{ 
    "author": "Brian Kernighan" 
    }, 
    { 
    "author": "Charles Dickens" 
    }] 

Co nie działa: Plain agregacja

{ 
    "aggs": { 
    "full_name": { 
     "terms": { 
     "field": "author" 
     } 
    } 
    } 
} 

mam następujący błąd:

{ 
    "error": { 
    "root_cause": [ 
     { 
     "reason": "Fielddata is disabled on text fields by default...", 
     "type": "illegal_argument_exception" 
     } 
    ] 
    } 
} 

Co pracował jak czar: dołączanie .keyword z polem

{ 
    "aggs": { 
    "full_name": { 
     "terms": { 
     "field": "author.keyword" 
     } 
    } 
    } 
} 

a wyjście próbki mogą być:

{ 
    "aggregations": { 
    "full_name": { 
     "buckets": [ 
     { 
      "doc_count": 372, 
      "key": "Charles Dickens" 
     }, 
     { 
      "doc_count": 283, 
      "key": "Brian Kernighan" 
     } 
     ], 
     "doc_count": 1000 
    } 
    } 
} 

wskazówka Bonus:

Załóżmy, że pole jest w que stion jest zagnieżdżony w następujący sposób:

[{ 
    "authors": [{ 
     "details": [{ 
      "name": "Brian Kernighan" 
      }] 
     }] 
    }, 
    { 
    "authors": [{ 
     "details": [{ 
      "name": "Charles Dickens" 
      }] 
     }] 
    } 
] 

Teraz poprawne zapytania staje:

{ 
    "aggregations": { 
    "full_name": { 
     "aggregations": { 
     "author_details": { 
      "terms": { 
      "field": "authors.details.name" 
      } 
     } 
     }, 
     "nested": { 
     "path": "authors.details" 
     } 
    } 
    }, 
    "size": 0 
} 
Powiązane problemy