Java 使用多台计算机时的过时Lucene索引

Java 使用多台计算机时的过时Lucene索引,java,mysql,hibernate,lucene,hibernate-search,Java,Mysql,Hibernate,Lucene,Hibernate Search,我已经启动并运行了一个Java/Hibernate/MySQL应用程序,它运行得非常好 最近,我一直在使用Lucene Hibernate搜索来加快搜索速度,并通过使用投影避免往返数据库。这也很有效,只是当应用程序在多台机器上使用时,索引会过时。在本地进行更改时,Lucene在更新本地索引方面做得很好,但它看不到来自其他机器的更改 目前,我是: 每周一次完全重新编制索引 更新所有记录的上次修改时间,并基于自上次索引以来修改的任何内容在开始时间更新本地索引 但这不适用于删除。如果某个东西在一台机器

我已经启动并运行了一个Java/Hibernate/MySQL应用程序,它运行得非常好

最近,我一直在使用Lucene Hibernate搜索来加快搜索速度,并通过使用投影避免往返数据库。这也很有效,只是当应用程序在多台机器上使用时,索引会过时。在本地进行更改时,Lucene在更新本地索引方面做得很好,但它看不到来自其他机器的更改

目前,我是:

每周一次完全重新编制索引 更新所有记录的上次修改时间,并基于自上次索引以来修改的任何内容在开始时间更新本地索引 但这不适用于删除。如果某个东西在一台机器上被删除,它仍然会出现在其他机器上的搜索中

有没有“标准”的方法来处理这个问题?我能想到几个选项,但没有一个能让我兴奋:

尽管如此,每天晚上都要完全恢复索引,但白天仍然不新鲜 维护一个已删除记录的表,以便我可以使用它在本地进行更新 在启动时执行到数据库的往返,以查找索引中但不在数据库中的所有条目 在数据库中添加某种触发器,以便在某些内容被删除时在某处记录某些内容。这将适用于更新和删除 很难相信这是一个新问题,但我找不到任何令人信服的答案


非常感谢您的帮助。

您让其他系统的复制看起来像是automagic,但不是吗?您有一些自行开发的逻辑,可以根据上次修改的时间更新本地索引,该时间由应用程序的每个实例使用其自己唯一的lucene索引完成。但这当然不适用于删除。@Gimby,谢谢。但我并不是说它应该自动发生。我得到的行为正是我所期望的;我只是想知道是否有一种标准的解决方法。我会让你的问题变得更糟:如果你连接MySQL workbench并手动删除一条记录,那么你所有的索引都过时了。这是你的基本问题;如何处理在应用程序实例的控制之外从数据库中删除的索引项。在这种情况下,您创建了一个数据库、多个实例、多个索引本身就非常不标准,这使得这个问题成为一个需要解决的难题;不使用Hibernate搜索,而只是从lucene搜索中获取ID,并使用这些ID使用IN子句从数据库中获取结果列表。ID可能已经过时了,但数据库不会在意,只会返回实际存在的内容。嗯,这似乎不符合预测的要点。关键是要避免往返数据库。也许更好的选择是执行投影搜索来传播列表,包括偶尔可能删除的条目,然后在后台,按照您的建议执行并执行数据库查询以找出缺少的内容,并从列表中删除不应该存在的任何内容。