Lucene:FastVectorHighlighter返回null

时间:2016-12-09 04:00:11

标签: java lucene

这就是我的所作所为:

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);

1 个答案:

答案 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);

      } 

我们可以看到IndexReaderPrefixQuery等需要FuzzyQuery