0

我正在尝试实现以下功能:

我有一个主要的中央 solr 服务器,其中包含来自所有用户的所有文档。
在每个客户端中,我想为他/她的文档创建一个本地缓存(所以如果没有互联网连接,用户仍然可以搜索他/她的本地缓存):首先导入在最后 2 中创建或更改的用户文档的索引周(例如),然后每天午夜获取该用户在此期间创建、更改或删除的文档的索引,并将更改导入本地缓存。

我使用http://wiki.apache.org/solr/DataImportHandler#SolrEntityProcessor
1. 首先,使用 /dataimport&query=+from:jeffery +last_modified:[${last_2weeks_ago} TO NOW] 导入该用户创建/更改的索引在过去 2 周内。
2. 对于增量导入,要检查创建或更改(不包括)删除的索引,我使用 /dataimport&query=+from:jeffery +last_modified:[${dataimporter.request.last_index_time} TO NOW]&clean=false。

但难的是如何获取最后一天被删除的文档的索引。我找到了一些方法来做到这一点,但它根本没有效率。

解决方案 1 - 效率不高。
1. 读取本地缓存中的所有 id(仅加载 ID)- 命名为 ${local_ids}
2. 读取远程中央服务器中 ${first_index_time} 和 ${last_index_time} 之间的所有 id - 命名为 ${ids_still_exist_in_remote_server}
3.删除的 id 将是 = ${local_ids}-${ids_still_exist _in_remote_server}

这可以通过每次仅从本地缓存服务器和远程 solr 服务器获取 N(例如 10000)个 id 来优化,然后在循环中计算差异,直到本地和远程服务器中没有剩余 id。

解决方案2:

在远程中央solr服务器中,当一个doc被删除时,在solr服务器中添加一条类似{docid,deletedate}的记录(可能是一些其他信息,如作者)。运行 delta-import 时,进行查询以获取 ${last_index_time} 到 NOW 之间的已删除 ID。

还不知道如何实现,但我认为这是可以实现的。但这会减慢远程中央 solr 服务器中的删除操作,并将记录远程服务器中不必要的已删除文档。(尽管我们可以使用线程来删除有关已删除文档的旧索引)

在 solr 中还有其他更好的方法吗?非常感谢您的帮助和建议:)

4

1 回答 1

1

您可以使用Solr 复制定期将内容从远程服务器复制到本地服务器,或使其基于事件(基于提交或优化)。
您无需跟踪更新。

于 2012-10-23T17:56:05.303 回答