我有一个使用 lucene 进行全文搜索的 jcr 存储库(带有嵌入式 servlet 容器)。搜索查询似乎触发了 CPU 利用率的飙升,即使在搜索结果返回后也会持续很长时间。我进行了线程转储,并意识到 Lucene Merge 线程导致 cpu 出现峰值。
"Lucene Merge Thread #0" daemon prio=10 tid=0x000000005fd95000 nid=0x5add runnable [0x0000000049fc8000]
java.lang.Thread.State: RUNNABLE
at org.apache.lucene.store.IndexOutput.writeVInt(IndexOutput.java:70)
at org.apache.lucene.index.FormatPostingsPositionsWriter.addPosition(FormatPostingsPositionsWriter.java:70)
at org.apache.lucene.index.SegmentMerger.appendPostings(SegmentMerger.java:701)
at org.apache.lucene.index.SegmentMerger.mergeTermInfos(SegmentMerger.java:635)
at org.apache.lucene.index.SegmentMerger.mergeTerms(SegmentMerger.java:573)
at org.apache.lucene.index.SegmentMerger.merge(SegmentMerger.java:156)
at org.apache.lucene.index.IndexWriter.mergeMiddle(IndexWriter.java:4443)
at org.apache.lucene.index.IndexWriter.merge(IndexWriter.java:4000)
at org.apache.lucene.index.ConcurrentMergeScheduler.doMerge(ConcurrentMergeScheduler.java:231)
at org.apache.lucene.index.ConcurrentMergeScheduler$MergeThread.run(ConcurrentMergeScheduler.java:288)
并且行为非常一致。搜索查询似乎反复触发合并(最终减慢了搜索本身的速度),这让我很难理解为什么搜索会触发索引合并。
另一个相关问题是搜索查询在一段时间内变慢。重新启动服务器后,lucene 查询会在大约 300-400 毫秒内返回,但如果服务器已经运行一周,相同的查询有时似乎需要 3-4 秒甚至更多时间。我检查了CPU和内存。当服务器空闲但一些搜索将 cpu 使用率发送到 100% 很长一段时间(见上文)时,cpu 使用率是正常的(低于 1%)。服务器有 12g 的内存,其中只有 4g 当前正在使用(所以没有内存问题)。那么为什么服务器运行一段时间后搜索会变慢(与重新启动相比)?是因为随着时间的推移缓慢地填充缓存并且正在对缓存进行线性扫描(但缓存检索应该非常快 - 缓存的目的)[编辑]它的 CRX 2.3 支持 JCR 2。0(JSR 283 规范)。该存储库有大约 40k 个文件,其中大约 15k 是 pdf,它们被索引为全文。