Lucene:为什么突出显示会产生额外的分词?

时间:2016-10-14 11:40:00

标签: java lucene

我正在使用Lucene进行一个小项目,我在此突出显示:

Fields tvFields = indexReader.getTermVectors(docId);
TokenStream contentTokenStream = TokenSources.getTokenStream(CONTENT_FILED_NAME, tvFields, content, analyzer, -1);
highlighter.getBestFragments(contentTokenStream, content, 3);

我认为tvFields已经包含filename的术语向量,但事实上,当highlighter执行时,程序会进行另一个单词拆分。由于内容可能非常庞大,因此这一步骤需要花费太多时间。

我有没有办法避免这个extra分词?我尝试使用FieldType中的content索引setStoreTermVectors(true)字段,但它不起作用!

1 个答案:

答案 0 :(得分:0)

是的,使用不同的荧光笔。

  • FastVectorHighlighter:在大型字段上表现良好,并且由于您已经存储了TermVectors,因此这可能是一个不错的选择。只需确保您还存储术语向量偏移和排名(setStoreTermVectorOffsetssetStoreTermVectorPositions)。

    FastVectorHighlighter highlighter = new FastVectorHighlighter(true, true);
    String highlightedResult = highlighter.getBestFragment(
            highlighter.getFieldQuery(myQuery),
            indexReader,
            docId,
            CONTENT_FIELD_NAME,
            50 //char length of fragment
        );
    
  • PostingsHighlighter:必须使用IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS编入索引。

    PostingsHighlighter highlighter2 = new PostingsHighlighter();
    TopDocs docs = indexSearcher.search(myQuery, 10);
    String[] highlightedResults = highlighter.highlight(
            CONTENT_FIELD_NAME, 
            myQuery, 
            indexSearcher, 
            docs
        );