这就是我的所作所为:
String textField1 = fastVectorHighlighter.getBestFragment(fastVectorHighlighter.getFieldQuery(query), indexReader, docId, SearchItem.FIELD_TEXT_FIELD1, DEFAULT_FRAGMENT_LENGTH);
这是query
:
((FIELD_TEXT_FIELD1:十五*)^4.0) (FIELD_TEXT_FIELD3:十五*)
原始文字是正确的(indexReader.document(docId).get(SearchItem.FIELD_TEXT_FIELD3)
是正确的。),并且肯定包含query
中的字符。
以下是我索引textField1:
的方法Field textField1 = new TextField(SearchItem.FIELD_TEXT_FIELD1, "", Field.Store.YES);
答案 0 :(得分:1)
问题解决了!
事实证明,我需要改变
fastVectorHighlighter.getFieldQuery(query)
到
fastVectorHighlighter.getFieldQuery(query, indexReader)
按照代码进入FieldQuery#flatten
,我们会发现Lucene没有以正常的方式处理PrefixQuery
:
} else if (sourceQuery instanceof CustomScoreQuery) {
final Query q = ((CustomScoreQuery) sourceQuery).getSubQuery();
if (q != null) {
flatten( applyParentBoost( q, sourceQuery ), reader, flatQueries);
}
} else if (reader != null) { // <<====== Here it is!
Query query = sourceQuery;
if (sourceQuery instanceof MultiTermQuery) {
MultiTermQuery copy = (MultiTermQuery) sourceQuery.clone();
copy.setRewriteMethod(new MultiTermQuery.TopTermsScoringBooleanQueryRewrite(MAX_MTQ_TERMS));
query = copy;
}
Query rewritten = query.rewrite(reader);
if (rewritten != query) {
// only rewrite once and then flatten again - the rewritten query could have a speacial treatment
// if this method is overwritten in a subclass.
flatten(rewritten, reader, flatQueries);
}
我们可以看到IndexReader
,PrefixQuery
等需要FuzzyQuery
。