Ngoài ra còn có một cách khác để làm điều đó bằng cách sử dụng script_fields kịch bản sau đây:
curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{
"query" : {
"match_all" : { }
},
"script_fields": {
"terms" : {
"script": "doc[field].values",
"params": {
"field": "message"
}
}
}
}'
Điều quan trọng cần lưu ý là trong khi kịch bản này trả về các điều khoản thực tế đã được lập chỉ mục, nó cũng lưu trữ tất cả các giá trị trường và lớn chỉ số có thể sử dụng nhiều bộ nhớ. Vì vậy, trên các chỉ số lớn, nó có thể là hữu ích hơn để lấy giá trị trường từ lĩnh vực lưu trữ hoặc nguồn và reparse chúng một lần nữa một cách nhanh chóng bằng cách sử dụng sau đây MVEL kịch bản:
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
kịch bản MVEL này có thể được lưu trữ như config/scripts/analyze.mvel
và sử dụng với truy vấn sau:
curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{
"query" : {
"match_all" : { }
},
"script_fields": {
"terms" : {
"script": "analyze",
"params": {
"field": "message"
}
}
}
}'
Điều này thật đáng sợ !!! Câu trả lời chính xác! – javanna
Đó là đáng sợ, nhưng vui vẻ. :) Tôi muốn nó có thể truy cập vào IndexReader trong DocLookup (nó ở đó, nhưng nó là riêng tư vào lúc này). Sau đó, nó sẽ có thể sử dụng vectơ hạn thay vì tái phân tích văn bản lần thứ hai. – imotov
Vâng, chắc chắn rồi. Nó sẽ không được tốt đẹp cũng để đọc các vectơ hạn mà không có kịch bản, có thể thông qua một plugin? – javanna