public static String findTermInDoc(int termHash, int docId, String indexFieldName, Analyzer fieldIndexAnalyzer,
SearchContext context) {
int readerIndex = context.searcher().readerIndex(docId);
IndexReader subReader = context.searcher().subReaders()[readerIndex];
int subDoc = docId - context.searcher().docStarts()[readerIndex];
context.lookup().setNextReader(subReader);
context.lookup().setNextDocId(subDoc);
String candidate;
Object value = context.lookup().source().extractValue(indexFieldName);
if (value instanceof ArrayList<?>) {
for (Object v : (ArrayList<?>) value) {
if (v == null) continue;
candidate = analyzeStringForTerm(v.toString(), termHash, indexFieldName, fieldIndexAnalyzer);
if (candidate != null) {
return candidate;
}
}
} else if (value != null) {
candidate = analyzeStringForTerm(value.toString(), termHash, indexFieldName, fieldIndexAnalyzer);
if (candidate != null) {
return candidate;
}
}
throw new ElasticSearchIllegalStateException(
"Failed to find hash code " + termHash + " in an array of docId " + docId +
". You can only use stored fields or when you store the original document under _source");
}