当搜索频繁出现的术语时,Lucene (4.6) 荧光笔的性能非常慢。
搜索速度很快(100 毫秒),但突出显示可能需要一个多小时(!)。
Details:使用了很棒的文本语料库(1.5GB 纯文本)。性能并不取决于文本是否被分割成更小的部分。 (也使用 500MB 和 5MB 的片段进行了测试。)
位置和偏移量被存储。
如果搜索非常频繁的术语或模式,TopDocs 检索速度很快(100 毫秒),但每个“searcher.doc(id)”调用都很昂贵(5-50 秒),并且 getBestFragments() 非常昂贵(超过 1 小时) 。甚至它们也是为此目的而存储和索引的。
(硬件:酷睿 i7、8GM 内存)
更大的背景:
它将用于语言分析研究。使用特殊的词干:它也存储词性信息。例如如果"adj adj adj adj 名词"被搜索时,它会给出文本中所有出现的内容以及上下文。
我可以调整它的性能,还是应该选择其他工具?
使用的代码:
//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