2014-04-01 15 views
6

Ho una serie di dati aziendali in un database ES. Sto cercando di ottenere il conteggio del numero di documenti in cui ciascuno si verifica, ma sto riscontrando alcuni problemi con la query di aggregazione. Sto cercando di escludere termini come "Corporation" o "Inc." Finora sono stato in grado di farlo con successo per un termine alla volta secondo il codice qui sotto.Query Aggregazione Elasticsearch con più esclusioni

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

che restituisce

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

Idealmente mi piacerebbe essere in grado di fare qualcosa di simile

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

Ma io non sono stati in grado di trovare un modo che non è così genera un errore

Ho esaminato la sezione "Termini" di Aggregazione nella documentazione ES e posso trovare solo un ampio per una singola esclusione. Mi chiedo se è possibile escludere più termini e in tal caso qual è la sintassi corretta per farlo.

Nota: so che è possibile impostare il campo su "not_analyzed" e ottenere raggruppamenti per i nomi di società completi anziché i nomi di suddivisione. Tuttavia, sono riluttanti a fare questo come l'analisi permette un secchio di essere più tollerante di variazioni di nome (ad esempio Microsoft Corp & Microsoft Corporation)

+1

Per info, questo è stato implementato come di ES 1.5. Vedi questo problema per maggiori informazioni: https://github.com/elastic/elasticsearch/issues/11959 –

risposta

10

Il exclude parameter is a regular expression, così si potrebbe usare un'espressione regolare che elenca in modo esaustivo tutte le scelte:

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

In questo modo, è importante evitare i valori (ad esempio, .). Se non viene generato genericamente, è possibile semplificare alcuni di questi raggruppandoli (ad esempio, inc\\.? copre inc\\.|inc o il più complicato: co(mpany|rporation)?). Se tutto ciò si verificherà molto, probabilmente vale la pena di testare come la complessità degli effetti comporterà prestazioni.

Sono inoltre disponibili flags opzionali, che sono le opzioni esistenti in Java Pattern. Quello che potrebbe tornare utile è CASE_INSENSITIVE.

"exclude" : { 
    "pattern" : "...expression as before...", 
    "flags" : "CASE_INSENSITIVE" 
} 
Problemi correlati