我正在使用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)
字段,但它不起作用!
答案 0 :(得分:0)
是的,使用不同的荧光笔。
FastVectorHighlighter:在大型字段上表现良好,并且由于您已经存储了TermVectors,因此这可能是一个不错的选择。只需确保您还存储术语向量偏移和排名(setStoreTermVectorOffsets
和setStoreTermVectorPositions
)。
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
);