Caching “Lucene临时例外情况”;“字段中的术语多于文档”;xyz";,但是它';s不可能在标记化字段上排序”;

Caching “Lucene临时例外情况”;“字段中的术语多于文档”;xyz";,但是它';s不可能在标记化字段上排序”;,caching,lucene,Caching,Lucene,在客户端的软件组件中使用了Lucene 2.9,它们使用了很多索引属性,有些是标记化的,有些不是。我们假设属性xyz被添加到索引中,如下所示: 添加(新字段(“xyz”,值,Field.Store.YES,Field.index.UN_标记化)) 当我们在索引中创建新对象时(比如说3秒钟内创建150个新对象),我看到了一个临时异常,软件试图对一个未分类的属性执行排序搜索: Caused by: java.lang.RuntimeException: there are more terms th

在客户端的软件组件中使用了Lucene 2.9,它们使用了很多索引属性,有些是标记化的,有些不是。我们假设属性
xyz
被添加到索引中,如下所示:

添加(新字段(“xyz”,值,Field.Store.YES,Field.index.UN_标记化))

当我们在索引中创建新对象时(比如说3秒钟内创建150个新对象),我看到了一个临时异常,软件试图对一个未分类的
属性执行排序搜索:

Caused by: java.lang.RuntimeException: there are more terms than documents in field "xyz", but it's impossible to sort on tokenized fields
        at org.apache.lucene.search.FieldCacheImpl$StringIndexCache.createValue(FieldCacheImpl.java:706) ~[lucene-core-2.9.2.jar:2.9.2 912433 - 2010-02-21 23:51:08]
        at org.apache.lucene.search.FieldCacheImpl$Cache.get(FieldCacheImpl.java:208) ~[lucene-core-2.9.2.jar:2.9.2 912433 - 2010-02-21 23:51:08]
        at org.apache.lucene.search.FieldCacheImpl.getStringIndex(FieldCacheImpl.java:676) ~[lucene-core-2.9.2.jar:2.9.2 912433 - 2010-02-21 23:51:08]
        at org.apache.lucene.search.FieldComparator$StringOrdValComparator.setNextReader(FieldComparator.java:667) ~[lucene-core-2.9.2.jar:2.9.2 912433 - 2010-02-21 23:51:08]
        at org.apache.lucene.search.TopFieldCollector$OneComparatorNonScoringCollector.setNextReader(TopFieldCollector.java:94) ~[lucene-core-2.9.2.jar:2.9.2 912433 - 2010-02-21 23:51:08]
        at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:245) ~[lucene-core-2.9.2.jar:2.9.2 912433 - 2010-02-21 23:51:08]
        at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:236) ~[lucene-core-2.9.2.jar:2.9.2 912433 - 2010-02-21 23:51:08]
        at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:179) ~[lucene-core-2.9.2.jar:2.9.2 912433 - 2010-02-21 23:51:08]
        at org.apache.lucene.search.Hits.getMoreDocs(Hits.java:113) ~[lucene-core-2.9.2.jar:2.9.2 912433 - 2010-02-21 23:51:08]
        at org.apache.lucene.search.Hits.<init>(Hits.java:90) ~[lucene-core-2.9.2.jar:2.9.2 912433 - 2010-02-21 23:51:08]
        at org.apache.lucene.search.Searcher.search(Searcher.java:63) ~[lucene-core-2.9.2.jar:2.9.2 912433 - 2010-02-21 23:51:08]
原因:java.lang.RuntimeException:字段“xyz”中的术语比文档多,但无法对标记字段进行排序
在org.apache.lucene.search.FieldCacheImpl$StringIndexCache.createValue(FieldCacheImpl.java:706)~[lucene-core-2.9.2.jar:2.9.2 912433-2010-02-21 23:51:08]
在org.apache.lucene.search.FieldCacheImpl$Cache.get(FieldCacheImpl.java:208)~[lucene-core-2.9.2.jar:2.9.2 912433-2010-02-21 23:51:08]
在org.apache.lucene.search.FieldCacheImpl.getStringIndex(FieldCacheImpl.java:676)~[lucene-core-2.9.2.jar:2.9.2 912433-2010-02-21 23:51:08]
在org.apache.lucene.search.FieldComparator$StringOrdValComparator.setnextrader(FieldComparator.java:667)~[lucene-core-2.9.2.jar:2.9.2 912433-2010-02-21 23:51:08]
在org.apache.lucene.search.TopFieldCollector$OneComparatorNonScoringCollector.setnextrader(TopFieldCollector.java:94)~[lucene-core-2.9.2.jar:2.9.2 912433-2010-02-21 23:51:08]
在org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:245)~[lucene-core-2.9.2.jar:2.9.2 912433-2010-02-21 23:51:08]
在org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:236)~[lucene-core-2.9.2.jar:2.9.2 912433-2010-02-21 23:51:08]
在org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:179)~[lucene-core-2.9.2.jar:2.9.2 912433-2010-02-21 23:51:08]
在org.apache.lucene.search.Hits.getMoreDocs(Hits.java:113)~[lucene-core-2.9.2.jar:2.9.2 912433-2010-02-21 23:51:08]
在org.apache.lucene.search.Hits.(Hits.java:90)~[lucene-core-2.9.2.jar:2.9.2 912433-2010-02-21 23:51:08]
在org.apache.lucene.search.Searcher.search(Searcher.java:63)~[lucene-core-2.9.2.jar:2.9.2 912433-2010-02-21 23:51:08]
可以观察异常数秒/分钟,然后它消失

该索引包含约100万个索引对象

我知道你可以问以下问题:
是否存在任何与未kenized属性相关的已知问题,如向索引添加新对象后运行的任何异步内部Lucene逻辑?至少在查看上面的stacktrace时,似乎有一个fieldcache在某些情况下可能会暂时损坏?我以为Lucene在我向索引中添加了一个对象之后没有做任何事情


感谢您的建议(请不要告诉我升级Lucene,我已经告诉我的客户100次了。)

我已经有很长一段时间没有使用2.9了。可能会尝试:在写入新记录后,调用
IndexWriter.optimize
,等待它完成,然后再打开新的
IndexReader
。谢谢,由于其他需要,我们尝试使用
IndexWriter.optimize
,但这是一个同步调用,需要很多秒才能完成(索引非常大),我们不能用这个。但你的建议给我的印象是,我对内部缓存机制的假设可能没有那么错误。这肯定是猜测,但我怀疑这与需要合并的更新/删除有关。基本上,术语计数与文档计数不同步。也许它得到了一个正确的文档计数,但在其术语计数中是否对标记为删除的文档中的术语进行计数,或者相反,它在术语计数中看到了新的术语,但在新的术语被合并之前,无法获得准确的文档计数。添加文档后是否调用commit()?如果optimize解决了这个问题,是否可以在后台运行optimize,并让IndexReader保持活动状态,直到它完成?@femtoRgon:据我所知,如果调用
commit()
,2.9版会阻止任何内容,所以这不是一个真正的解决方案,因为我认为这个调用需要几分钟才能完成索引的大小。