2014-04-01 14 views
6

Ich habe eine Reihe von Unternehmensdaten in einer ES-Datenbank. Ich möchte die Anzahl der Dokumente ermitteln, in denen jeder auftritt, aber ich habe einige Probleme mit der Aggregationsabfrage. Ich möchte Begriffe wie "Corporation" oder "Inc." ausschließen. Bis jetzt war ich in der Lage, dies für einen Begriff zu einer Zeit erfolgreich zu tun, wie im folgenden Code beschrieben.Elasticsearch Aggregation Abfrage mit mehreren Ausnahmen

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

Welche kehrt

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

Im Idealfall würde ich etwas zu können, wie tun wie

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

Aber ich habe nicht in der Lage gewesen, einen Weg zu finden, das nicht der Fall ist einen Fehler werfen

Ich habe den Abschnitt "Bedingungen" von Aggregation in der ES-Dokumentation angeschaut und kann nur einen ex finden Ich frage mich, ob es möglich ist, mehrere Begriffe auszuschließen, und wenn ja, wie lautet die richtige Syntax dafür?

Hinweis: Ich weiß, dass ich das Feld auf "not_analyzed" setzen und Gruppierungen für vollständige Firmennamen statt der geteilten Namen erhalten konnte. Allerdings bin ich zögerlich dies als Analyse zu tun, erlaubt es einem Eimer toleranter Namensvariationen (dh Microsoft Corp & Microsoft Corporation)

+1

Für Informationen wird dies als der ES 1.5 implementiert. Weitere Informationen finden Sie in dieser Ausgabe unter https://github.com/elastic/elasticsearch/issues/11959 –

Antwort

10

Die exclude parameter is a regular expression zu sein, so dass Sie einen regulären Ausdruck verwenden könnte, die erschöpfend alle Möglichkeiten aufgeführt:

Dies ist generisch wichtig, um Werte zu vermeiden (z. Wenn es nicht generisch erzeugt wird, könnten Sie einige davon vereinfachen, indem Sie sie gruppieren (z. B. inc\\.? umfasst inc\\.|inc, oder die kompliziertere: co(mpany|rporation)?). Wenn dies viel läuft, lohnt es sich zu testen, wie die zusätzliche Komplexität die Leistung beeinflusst.

Es gibt auch optional flags, die angewendet werden können, welche die Optionen sind, die in Java Pattern existieren. Die eine, die nützlich sein könnte, ist CASE_INSENSITIVE.

"exclude" : { 
    "pattern" : "...expression as before...", 
    "flags" : "CASE_INSENSITIVE" 
} 
Verwandte Themen