Java Lucene updateDocument未删除文档

Java Lucene updateDocument未删除文档,java,lucene,yammer,Java,Lucene,Yammer,这似乎是一个常见的问题,除了我以前没有遇到过这个问题,而且通常的修复方法不起作用。这可能有点傻,但我找不到 我想为yammer站点编制索引,因为yammer api对于我来说不够快,问题是当我尝试使用updateDocument功能更新索引时,旧的索引不会被删除。但我有一个未经分析的存储唯一密钥 以下是相关代码: Document newdoc = new Document(); newdoc.add(new Field(YammerMessageFields.URL, resultUrl, F

这似乎是一个常见的问题,除了我以前没有遇到过这个问题,而且通常的修复方法不起作用。这可能有点傻,但我找不到

我想为yammer站点编制索引,因为yammer api对于我来说不够快,问题是当我尝试使用updateDocument功能更新索引时,旧的索引不会被删除。但我有一个未经分析的存储唯一密钥

以下是相关代码:

Document newdoc = new Document();
newdoc.add(new Field(YammerMessageFields.URL, resultUrl, Field.Store.YES, Field.Index.NOT_ANALYZED));
newdoc.add(new Field(YammerMessageFields.THREAD_ID, threadID.toString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
newdoc.add(new Field(YammerMessageFields.AUTHOR, senderName, Field.Store.YES, Field.Index.ANALYZED));
newdoc.add(new Field(YammerMessageFields.CONTENTS, resultText, Field.Store.YES, Field.Index.ANALYZED));
Term key = new Term(YammerMessageFields.THREAD_ID, newdoc.getFieldable(YammerMessageFields.THREAD_ID).toString());
logger.debug("updating document with key: " + key);
try {
    IndexWriter writer = getIndexWriter();
    writer.updateDocument(key, newdoc);
    writer.close();
} catch (IOException e) {
}
我在日志中看到的是:

2012-05-11 12:02:29,816 DEBUG [http-8088-2] LuceneIndex - https://www.yammer.com/api/v1/messages/?newer_than=0
2012-05-11 12:02:38,594 DEBUG [http-8088-2] LuceneIndex - updating document with key: threadid:stored,indexed<threadid:173285202>
2012-05-11 12:02:45,167 DEBUG [http-8088-2] LuceneIndex - updating document with key: threadid:stored,indexed<threadid:173033239>
2012-05-11 12:02:51,686 DEBUG [http-8088-2] LuceneIndex - updating document with key: threadid:stored,indexed<threadid:173014568>
2012-05-11 12:02:51,871 DEBUG [http-8088-2] LuceneIndex - new items:3

2012-05-11 12:03:27,393 DEBUG [http-8088-2] YammerResource - return all documents
2012-05-11 12:03:27,405 DEBUG [http-8088-2] YammerResource - nr docs:3
2012-05-11 12:03:27,405 DEBUG [http-8088-2] YammerResource - nr dels:0

...
next update
...

2012-05-11 12:03:35,802 DEBUG [http-8088-2] LuceneIndex - https://www.yammer.com/api/v1/messages/?newer_than=0
2012-05-11 12:03:43,933 DEBUG [http-8088-2] LuceneIndex - updating document with key: threadid:stored,indexed<threadid:173322760>
2012-05-11 12:03:50,467 DEBUG [http-8088-2] LuceneIndex - updating document with key: threadid:stored,indexed<threadid:173285202>
2012-05-11 12:03:56,982 DEBUG [http-8088-2] LuceneIndex - updating document with key: threadid:stored,indexed<threadid:173056406>
2012-05-11 12:04:03,533 DEBUG [http-8088-2] LuceneIndex - updating document with key: threadid:stored,indexed<threadid:173033239>
2012-05-11 12:04:10,097 DEBUG [http-8088-2] LuceneIndex - updating document with key: threadid:stored,indexed<threadid:173030769>
2012-05-11 12:04:16,629 DEBUG [http-8088-2] LuceneIndex - updating document with key: threadid:stored,indexed<threadid:173014568>
2012-05-11 12:04:23,169 DEBUG [http-8088-2] LuceneIndex - updating document with key: threadid:stored,indexed<threadid:173003570>
2012-05-11 12:04:23,341 DEBUG [http-8088-2] LuceneIndex - new items:7

2012-05-11 12:05:09,694 DEBUG [http-8088-1] YammerResource - return all documents
2012-05-11 12:05:09,696 DEBUG [http-8088-1] YammerResource - nr docs:10
2012-05-11 12:05:09,696 DEBUG [http-8088-1] YammerResource - nr dels:0
2012-05-11 12:02:29816调试[http-8088-2]LuceneIndex-https://www.yammer.com/api/v1/messages/?newer_than=0
2012-05-11 12:02:38594调试[http-8088-2]LuceneIndex-使用关键字threadid更新文档:已存储,已索引
2012-05-11 12:02:45167调试[http-8088-2]LuceneIndex-使用关键字threadid更新文档:已存储,已索引
2012-05-11 12:02:51686调试[http-8088-2]LuceneIndex-使用关键字threadid更新文档:已存储,已索引
2012-05-11 12:02:51871调试[http-8088-2]LuceneIndex-新项目:3
2012-05-11 12:03:27393调试[http-8088-2]YammerResource-返回所有文档
2012-05-11 12:03:27405调试[http-8088-2]YammerResource-nr文档:3
2012-05-11 12:03:27405调试[http-8088-2]YammerResource-nr dels:0
...
下次更新
...
2012-05-11 12:03:35802调试[http-8088-2]LuceneIndex-https://www.yammer.com/api/v1/messages/?newer_than=0
2012-05-11 12:03:43933调试[http-8088-2]LuceneIndex-使用关键字threadid更新文档:已存储,已索引
2012-05-11 12:03:50467调试[http-8088-2]LuceneIndex-使用关键字threadid更新文档:已存储,已索引
2012-05-11 12:03:56982调试[http-8088-2]LuceneIndex-使用关键字threadid更新文档:已存储,已索引
2012-05-11 12:04:03533调试[http-8088-2]LuceneIndex-使用关键字threadid更新文档:已存储,已索引
2012-05-11 12:04:10097调试[http-8088-2]LuceneIndex-使用关键字threadid更新文档:已存储,已索引
2012-05-11 12:04:16629调试[http-8088-2]LuceneIndex-使用关键字threadid更新文档:已存储,已索引
2012-05-11 12:04:23169调试[http-8088-2]LuceneIndex-使用关键字threadid更新文档:已存储,已索引
2012-05-11 12:04:23341调试[http-8088-2]LuceneIndex-新项目:7
2012-05-11 12:05:09694调试[http-8088-1]YammerResource-返回所有文档
2012-05-11 12:05:09696调试[http-8088-1]YammerResource-nr文档:10
2012-05-11 12:05:09696调试[http-8088-1]YammerResource-nr dels:0
因此,密钥会再次出现(还有4个新的),但完成后,我的存储中有10个文档,而不是7个(还有3个已删除的文档)

编辑:下面是我如何找到这些项目的,但我实际显示了它们,并与Luke一起检查了它们

IndexReader r = IndexReader.open(searchIndex.getIndex());
                List<Document> docList = new ArrayList<Document>();
                List<Document> delList = new ArrayList<Document>();

                int num = r.numDocs();
                num += r.numDeletedDocs();
                for ( int i = 0; i < num && i < max; i++)
                {
                    if ( ! r.isDeleted( i))
                        docList.add(r.document(i));
                    else
                        delList.add(r.document(i));

                }
                r.close();
                logger.debug("nr docs:" + docList.size());
                logger.debug("nr dels:" + delList.size());
IndexReader r=IndexReader.open(searchIndex.getIndex());
List docList=new ArrayList();
List delList=new ArrayList();
int num=r.numDocs();
num+=r.numDeletedDocs();
对于(int i=0;i
如果不运行一些测试代码,我不确定,但我觉得这是错误的:

Term key = new Term(YammerMessageFields.THREAD_ID, 
   newdoc.getFieldable(YammerMessageFields.THREAD_ID).toString());
你确定不应该是:

Term key = new Term(YammerMessageFields.THREAD_ID, 
   newdoc.getFieldable(YammerMessageFields.THREAD_ID).stringValue());
然后继续使用该键尝试更新任何匹配的现有文档。如果密钥错误,那么文档更新可能会自动失败。我怀疑
术语
上的
toString()
实际上只会给您一个对象引用,这意味着更新将永远无法工作


调用
toString()
进行日志记录或调试以外的任何操作(即其中包含逻辑的任何操作)通常是错误的

如果不运行一些测试代码,我不确定,但我觉得这是错误的:

Term key = new Term(YammerMessageFields.THREAD_ID, 
   newdoc.getFieldable(YammerMessageFields.THREAD_ID).toString());
你确定不应该是:

Term key = new Term(YammerMessageFields.THREAD_ID, 
   newdoc.getFieldable(YammerMessageFields.THREAD_ID).stringValue());
然后继续使用该键尝试更新任何匹配的现有文档。如果密钥错误,那么文档更新可能会自动失败。我怀疑
术语
上的
toString()
实际上只会给您一个对象引用,这意味着更新将永远无法工作


调用
toString()
进行日志记录或调试以外的任何操作(即其中包含逻辑的任何操作)通常是错误的

什么API调用用于查找文档计数?可能是。如果调用
maxDoc
,则已知不考虑已删除的文档。当然,我说的是Lucene API调用。没有比它更高的了。使用什么API调用来查找文档计数?可能是。如果调用
maxDoc
,则已知不考虑已删除的文档。当然,我说的是Lucene API调用。没有比它更高的了。stringValue()解决了这个问题。谢谢你,奇怪的是这在另一个版本中起作用了…不,这并不奇怪。程序员经常更改
toString()
方法的实现;这就是为什么你永远不应该依赖于他们返回一个特定的值。顺便说一句,更新没有失败,文档实际上被添加了,只是删除失败了。更新实际上是一个原子删除/添加-我不认为在Lucene中有“更新”文档的方法。请参阅org.apache.lucene.document.document)。如果删除与任何文档都不匹配,则没有任何内容表明添加部分被中止。所以-因为没有匹配的文档来替换“更新”失败。@Jon还有
StringBuilder.toString
StringWriter.toString
——还有很多其他的API是
toString
。stringValue()解决了这个问题。谢谢你,奇怪的是这在另一个版本中起作用了…不,这并不奇怪。程序员经常更改imp