2012-04-10 17 views
10

Sto utilizzando Termini facet per ottenere tutti i valori univoci e il loro conteggio per un campo. E sto ottenendo risultati sbagliati.Come evitare che i termini di sfaccettatura vengano tokenizzati

term: web 
Count: 1191979 
term: misc 
Count: 1191979 
term: passwd 
Count: 1191979 
term: etc 
Count: 1191979 

Mentre il risultato effettivo dovrebbe essere:

term: WEB-MISC /etc/passwd 
Count: 1191979 

Ecco il mio esempio di query:

{ 
    "facets": { 
    "terms1": { 
     "terms": { 
     "field": "message" 
     } 
    } 
    } 
} 
+0

Potrebbe aggiornare la questione con un esempio _short_ dei dati e un esempio di _short_ della query che stai facendo, quindi è più informativo per gli utenti di venire qui da Ricerche di Google, ecc? – karmi

risposta

16

Se reindexing è un'opzione, sarebbe la migliore per cambiare la mappatura e marchio questo campo come not_analyzed

"your_field" : { "type": "string", "index" : "not_analyzed" } 

È possibile utilizzare multi field type se mantenere una versione analizzata del campo è desiderato:

"your_field" : { 
    "type" : "multi_field", 
    "fields" : { 
     "your_field" : {"type" : "string", "index" : "analyzed"}, 
     "untouched" : {"type" : "string", "index" : "not_analyzed"} 
    } 
} 

In questo modo, è possibile continuare a utilizzare your_field nelle query, durante l'esecuzione di ricerche sfaccettatura utilizzando your_field.untouched.

In alternativa, se questo campo è memorizzato, è possibile utilizzare una sfaccettatura campo script invece:

"facets" : { 
    "term" : { 
    "terms" : { 
     "script_field" : "_fields.your_field.value" 
    } 
    } 
} 

Come l'ultima risorsa, se questo campo non viene memorizzato, ma fonte di record viene memorizzato nell'indice, è può provare questo:

"facets" : { 
    "term" : { 
    "terms" : { 
     "script_field" : "_source.your_field" 
    } 
    } 
} 

La prima soluzione è la più efficiente. L'ultima soluzione è la meno efficiente e potrebbe richiedere molto tempo su un indice di grandi dimensioni.

+0

Ho provato lo script_field ma sembrava produrre un errore. La mia query attuale è simile a questa: http://www.pastebin.com/XwJMM7Eq – jmnwong

+0

Probabilmente fornisce l'errore "proprietà non identificabile dell'identificatore: logsource". Questo perché lo script elasticsearch non sa cosa significhi 'logsource'. Prova a sostituirlo con _fields.logsource – imotov

+0

Si presenta come "term" "[email protected]" – jmnwong

-1

Ho brevemente spiegato questo problema e proposto due soluzioni here. Ho parlato di approcci multipli qui. Uno è l'uso di not_analyzed per preservare la stringa così com'è. Ma poiché ha lo svantaggio di essere insensibile alle maiuscole e minuscole, un approccio migliore sarebbe utilizzare tokenizer delle parole chiave + filtro minuscolo

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – Leigh

+0

Ho informato la mia risposta. –

0

Wow, ho anche ottenuto questo stesso problema oggi mentre termina l'aggregazione nella ricerca elastica recente. Dopo aver fatto ricerche su google e una certa comprensione parziale, ho scoperto come funziona questa indicizzazione geniale (che è molto semplice).

query possono trovare solo termini che in realtà esistono nel indice invertito

Quando si indice la seguente stringa

"WEB-MISC /etc/passwd" 

si passerà ad un analizzatore. L'analizzatore potrebbe renderlo disponibile in

"WEB", "MISC", "etc" and "passwd" 

con i relativi dettagli di posizione. E questo potrebbe gettoni filtrato in minuscolo come

"web", "misc", "etc" and "passwd" 

Così, dopo l'indicizzazione, la query di ricerca può vedere il sopra 4 soltanto. non la parola completa "WEB-MISC/etc/passwd".Per il vostro requisito i seguenti sono le opzioni è possibile utilizzare

1.Change the Default Analyzer used by elasticsearch([link][1]) 
2.If it is not need, just TurnOff the analyzer by setting 'not_analyzed' for the fields you need 
3.To convert the already indexed data searchable, re-indexing is the only option 
Problemi correlati