I am trying to write an expert script plugin following the instructions given in
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/modules-scripting-engine.html
"mappings": {
"type": {
"properties": {
"blob": {
"type": "binary"
}
}
}
}
I created 3 documents with sample documents and made the blob field a byte[] in my java code. And wrote the documents to my index. I have the following code in my plugin and i always get "null" where i print "Loaded docValues. docValues = ". Can anyone advice me whats wrong ?
@Override
public LeafSearchScript getLeafSearchScript(LeafReaderContext context) throws IOException {
PostingsEnum postings = context.reader().postings(new Term(field, term));
BinaryDocValues docValues = context.reader().getBinaryDocValues(blobField);
logger.info("Loaded docValues. docValues = "+docValues);
if (postings == null) {
// the field and/or term don't exist in this segment, so always return 0
logger.info("the field and/or term don't exist in this segment, so always return 0");
return () -> 0.0d;
}
return new LeafSearchScript() {
int currentDocid = -1;
@Override
public void setDocument(int docid) {
// advance has undefined behavior calling with a docid <= its current docid
if (postings.docID() < docid) {
try {
postings.advance(docid);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
currentDocid = docid;
}
@Override
public double runAsDouble() {
BytesRef bytesRef = null;
double score = 1.0;
if (docValues == null) {
logger.info("docValues is null");
return score;
}
try {
logger.info("getting docValues for docId="+currentDocid);
bytesRef = docValues.get(currentDocid);
return score;
} catch (IOException e) {
throw new UncheckedIOException(e);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return score;
}
};
}
@Override
public boolean needsScores() {
return false;
}
};
}
throw new IllegalArgumentException("Unknown script name " + scriptSource);
}
Thanks
Srini