java在lucene中非常缓慢的突出表现
Lucene(4.6)highlighter在搜索频繁项时的性能非常慢。 搜索速度很快(100毫秒),但高亮显示可能需要一个多小时(!)
细节:使用了很棒的文本语料库(1.5GB纯文本)。性能并不取决于文本是否被分割成更多的小块。(同时使用500MB和5MB芯片进行测试。) 存储位置和偏移。 如果搜索一个非常频繁的术语或模式,TopDocs的检索速度很快(100毫秒),但每次“searcher.doc(id)”调用都很昂贵(5-50秒),而getBestFragments()非常昂贵(超过1小时)。甚至它们也为此目的而被存储和索引。 (硬件:core i7,8GM mem)
更大背景: 这将有助于语言分析研究。使用了一种特殊的词干:它还存储词性信息。例如,如果搜索了“adj adj noun”,它会给出文本中出现的所有上下文
我可以调整它的性能,还是应该选择其他工具
使用的代码:
//indexing
FieldType offsetsType = new FieldType(TextField.TYPE_STORED);
offsetsType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
offsetsType.setStored(true);
offsetsType.setIndexed(true);
offsetsType.setStoreTermVectors(true);
offsetsType.setStoreTermVectorOffsets(true);
offsetsType.setStoreTermVectorPositions(true);
offsetsType.setStoreTermVectorPayloads(true);
doc.add(new Field("content", fileContent, offsetsType));
//quering
TopDocs results = searcher.search(query, limitStart+limit);
int endPos = Math.min(results.scoreDocs.length, limitStart+limit);
int startPos = Math.min(results.scoreDocs.length, limitStart);
for (int i = startPos; i < endPos; i++) {
int id = results.scoreDocs[i].doc;
// bottleneck #1 (5-50s):
Document doc = searcher.doc(id);
FastVectorHighlighter h = new FastVectorHighlighter();
// bottleneck #2 (more than 1 hour):
String[] hs = h.getBestFragments(h.getFieldQuery(query), m, id, "content", contextSize, 10000);
相关(未回答)问题:https://stackoverflow.com/questions/19416804/very-slow-solr-performance-when-highlighting
# 1 楼答案
BestFragments依赖于您正在使用的分析器完成的标记化。如果你必须分析这么大的文本,最好在索引时存储术语向量
WITH_POSITIONS_OFFSETS
请阅读this 和this book
通过这样做,您不需要在运行时分析所有文本,因为您可以选择一种方法来重用现有的术语向量,这将减少高亮显示时间