Istnieje również inny sposób to zrobić za pomocą następującego script_fields skrypt:
curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{
"query" : {
"match_all" : { }
},
"script_fields": {
"terms" : {
"script": "doc[field].values",
"params": {
"field": "message"
}
}
}
}'
Ważne jest, aby pamiętać, że ten skrypt zwraca rzeczywiste warunki, które zostały zindeksowane, ale także buforuje wszystkie wartości pól i na dużych indeksy mogą zużywać dużo pamięci. Tak więc, na dużych indeksów, to może być bardziej przydatne do pobierania wartości pól z przechowywanych pól lub źródła i ponownej analizy ich ponownie w locie za pomocą następującego MVEL skrypt:
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
Ten skrypt MVEL mogą być przechowywane jako config/scripts/analyze.mvel
i używane z następującym zapytaniem:
curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{
"query" : {
"match_all" : { }
},
"script_fields": {
"terms" : {
"script": "analyze",
"params": {
"field": "message"
}
}
}
}'
To jest przerażające !!! Świetna odpowiedź! – javanna
To jest przerażające, ale zabawne. :) Chciałbym móc uzyskać dostęp do IndexReader w DocLookup (jest tam, ale w tej chwili jest prywatny). Wtedy możliwe byłoby użycie wektorów termowych zamiast ponownej analizy tekstu za drugim razem. – imotov
Tak, jasne. Czy nie byłoby miło również przeczytać wektory terminów bez skryptów, może poprzez wtyczkę? – javanna