2014-04-01 14 views
6

Mam kilka firmowych danych w bazie danych ES. Próbuję pobrać liczbę dokumentów, z których każdy występuje, ale mam pewne problemy z zapytaniem o agregację. Szukam wykluczenia takich terminów, jak "Korporacja" lub "Inc." Do tej pory udało mi się to zrobić z powodzeniem na jeden semestr naraz, zgodnie z poniższym kodem.Elasticsearch Zapytanie o agregację z wieloma wykluczeniami

{ 
    "aggs" : { 
     "companies" : { 
      "terms" : { 
       "field" : "Companies.name", 
       "exclude" : "corporation" 
      } 
     } 
    } 
} 

Które zwraca

"aggregations": { 
    "assignee": { 
     "buckets": [ 
      { 
       "key": "inc", 
       "doc_count": 375 
      }, 
      { 
       "key": "company", 
       "doc_count": 252 
      } 
     ] 
    } 
} 

Idealnie chciałbym być w stanie zrobić coś takiego

{ 
    "aggs" : { 
     "companies" : { 
      "terms" : { 
       "field" : "Companies.name", 
       "exclude" : ["corporation", "inc.", "inc", "co", "company", "the", "industries", "incorporated", "international"], 
      } 
     } 
    } 
} 

Ale nie udało się znaleźć sposób, który nie wrzuć błąd

Zajrzałem do sekcji "Warunki" Agregacji w dokumentacji ES i mogę znaleźć tylko wystarczy jedno wykluczenie. Zastanawiam się, czy można wykluczyć wiele terminów, a jeśli tak, to jaka jest prawidłowa składnia.

Uwaga: Wiem, że mogę ustawić pole na "nie_analizowane" i uzyskać grupy dla pełnych nazw firm zamiast nazw dzielonych. Jednak jestem niezdecydowany zrobić to jako analizy pozwala wiadro być bardziej tolerancyjny odmian nazwisko (tj Microsoft Corp & Microsoft Corporation)

+1

Dla informacji, ten został wdrożony jako ES 1.5. Zobacz ten numer, aby uzyskać więcej informacji: https://github.com/elastic/elasticsearch/issues/11959 –

Odpowiedz

10

exclude parameter is a regular expression, więc można użyć wyrażenia regularnego, które w sposób wyczerpujący wymienia wszystkie możliwości:

"exclude" : 
    "corporation|inc\\.|inc|co|company|the|industries|incorporated|international" 

Powszechnie ważne jest unikanie wartości (np. .). Jeśli nie jest generowany generycznie, możesz uprościć niektóre z nich, grupując je (np. inc\\.? obejmuje inc\\.|inc lub bardziej skomplikowane: co(mpany|rporation)?). Jeśli to dużo, to prawdopodobnie warto przetestować, w jaki sposób zwiększona złożoność wpływa na wydajność.

Dostępne są także opcjonalne flags, które można zastosować, które istnieją w Javie Pattern. Ten, który może się przydać, to CASE_INSENSITIVE.

"exclude" : { 
    "pattern" : "...expression as before...", 
    "flags" : "CASE_INSENSITIVE" 
} 
Powiązane problemy