如果索引未在Lucene 8.6.1中操作,docids是否为常量?

如果索引未在Lucene 8.6.1中操作,docids是否为常量?,lucene,Lucene,假设我每天在同一时间更新索引一次。在两次更新之间的时间内(大约21小时),docId会保持不变吗?正如@andrewjames提到的,docId只有在发生合并时才会改变。docsId基本上是文档在特定段中的数组索引位置 这样做的副作用还在于,如果您有多个段,那么可能会将给定的docId分配给多个文档,一个在一个段中,一个在另一个段中,等等。如果这是一个问题,您可以在构建索引后进行强制合并,以便只有一个段。那么,此时没有两个文档具有相同的docId 如果不进行合并,则给定文档的docId不会更改。

假设我每天在同一时间更新索引一次。在两次更新之间的时间内(大约21小时),docId会保持不变吗?

正如@andrewjames提到的,docId只有在发生合并时才会改变。docsId基本上是文档在特定段中的数组索引位置

这样做的副作用还在于,如果您有多个段,那么可能会将给定的docId分配给多个文档,一个在一个段中,一个在另一个段中,等等。如果这是一个问题,您可以在构建索引后进行强制合并,以便只有一个段。那么,此时没有两个文档具有相同的docId

如果不进行合并,则给定文档的docId不会更改。除非调用强制合并或添加或删除文档,或者升级索引,否则合并不会发生


所以…如果你建立你的索引,并且不添加文档,删除文档,或者调用强制合并,或者升级你的索引,那么docid将是稳定的。但是下次你建立索引时,一个给定的文档可能会收到一个完全不同的文档Id。正如@andrewjames所说,文档Id分配和分配时间是Lucene的内部事务,因此即使你知道当前分配的时间和方式,你也应该谨慎地依赖它们。

不是答案,只是一个指针,如果您还没有看到:我看到的关于docid讨论的唯一地方是在中,其中讨论了段和docid。它的结论是:“docid值必须始终被视为内部实现,不能作为应用程序的一部分公开,也不能在Lucene的内部API之外存储或引用。”。但合并究竟何时触发?当一个段变得足够大时,是否立即执行?作为一个背景过程,你无法预测时间?谢谢@andrewjames我已经阅读了文档,我希望有人能在第二条评论中回答你的问题。我已经发布了另一个我正在努力实现的目标。如果你有答案那就太好了。那很有帮助,谢谢!我决定使用docid。你能告诉我升级索引意味着什么吗?你指的是Lucene的版本吗?如果可能的话,你能提供一个链接到强制合并的示例或文档吗?是的,通过“升级索引”,我的意思是使用Lucene版本的索引,该版本至少比用于创建索引的版本大一个主版本。我在谷歌上搜索了一下,但没有看到任何关于强制合并的好代码示例,但它基本上只是
IndexWriter
类上的一个方法。这里的源代码:您可以像
indexWriter.forceMerge(maxNumSegments,doWait)那样调用它