C'è anche un altro modo per farlo utilizzando il seguente script_fields script:
curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{
"query" : {
"match_all" : { }
},
"script_fields": {
"terms" : {
"script": "doc[field].values",
"params": {
"field": "message"
}
}
}
}'
E 'importante notare che, mentre questo script restituisce i termini effettivi che sono stati indicizzati, memorizza nella cache tutti i valori di campo e di grandi dimensioni gli indici possono usare molta memoria. Così, su grandi indici, potrebbe essere più utile per recuperare i valori di campo da campi o fonte memorizzati e rianalizzare nuovamente al volo utilizzando il seguente MVEL script:
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import java.io.StringReader;
// Cache analyzer for further use
cachedAnalyzer=(isdef cachedAnalyzer)?cachedAnalyzer:doc.mapperService().documentMapper(doc._type.value).mappers().indexAnalyzer();
terms=[];
// Get value from Fields Lookup
//val=_fields[field].values;
// Get value from Source Lookup
val=_source[field];
if(val != null) {
tokenStream=cachedAnalyzer.tokenStream(field, new StringReader(val));
CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute);
while(tokenStream.incrementToken()) {
terms.add(termAttribute.toString())
};
tokenStream.close();
}
terms
Questo script MVEL può essere memorizzato come config/scripts/analyze.mvel
e usato con la seguente domanda:
curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{
"query" : {
"match_all" : { }
},
"script_fields": {
"terms" : {
"script": "analyze",
"params": {
"field": "message"
}
}
}
}'
Questo è spaventoso !!! Bella risposta! – javanna
È spaventoso, ma divertente. :) Vorrei poter accedere a IndexReader in DocLookup (è lì, ma al momento è privato). Quindi sarebbe stato possibile utilizzare i vettori di termini invece di analizzare nuovamente il testo la seconda volta. – imotov
Sì, certo. Non sarebbe bello anche leggere il termine vettori senza script, magari attraverso un plugin? – javanna