lucene 中的高光性能非常慢

Posted

技术标签:

【中文标题】lucene 中的高光性能非常慢【英文标题】:very slow highlight performance in lucene 【发布时间】:2014-03-08 04:05:43 【问题描述】:

Lucene (4.6) 荧光笔在搜索常用词时性能非常慢。 搜索速度很快(100 毫秒),但突出显示可能需要一个多小时(!)。

详细信息: 使用了很棒的文本语料库(1.5GB 纯文本)。性能不取决于文本是否被分成更多的小块。 (也用 500MB 和 5MB 块进行了测试。) 存储位置和偏移量。 如果搜索一个非常频繁的术语或模式,TopDocs 检索速度很快(100 毫秒),但每个“searcher.doc(id)”调用都很昂贵(5-50 秒),getBestFragments() 非常昂贵(超过 1 小时) .甚至它们也为此目的被存储和索引。 (硬件:core i7、8GM mem)

更大的背景: 它将服务于语言分析研究。使用了一种特殊的词干提取:它也存储词性信息。例如,如果 "adj adj 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://***.com/questions/19416804/very-slow-solr-performance-when-highlighting

【问题讨论】:

【参考方案1】:

BestFragments 依赖于您正在使用的分析器完成的标记化。如果要分析这么大的文本,最好在索引时存储词向量WITH_POSITIONS_OFFSETS

请阅读this 和this book

通过这样做,您无需在运行时分析所有文本,因为您可以选择一种方法来重用现有的术语向量,这将减少突出显示的时间。

【讨论】:

非常有趣。我要调查一下。 有问题的代码已经包含位置和偏移量。应该是别的吗? @AR1 这个答案如何被投票?该问题清楚地表明位置和偏移量已存储。所有这些答案提供的是阅读文档?这有一个 -1 值。我花了 20 分钟试图记住我的密码才能登录并对此发表评论。

以上是关于lucene 中的高光性能非常慢的主要内容,如果未能解决你的问题,请参考以下文章

学习搜索必须先了解的Lucene知识

Lucene高性能索引之道

.NET开发过程中的全文索引使用技巧之Solr(转)

ElasticSearch(es)基于Lucene的搜索服务器

Lucene的算法

Lucene的索引(Index)里面究竟存些什么?