我做delta dataimport。 我使用delete_item表来获取数据,我应该从solr索引中删除它。
如何执行查询
TRUNCATE TABLE delete_item
执行delta导入后。
可以使用solr,或者我应该使用cron作业。
答案 0 :(得分:3)
没有开箱即用,为此配置我的XML解决方案。从Solr的角度来看,这是有道理的。 Solr希望自我管理而不管理其他数据源。但你可以做几件事。
我个人建议(2)因为这不包括编写需要部署到solr实例的自定义代码。因此,该解决方案可转移到solr云。
在此回答https://stackoverflow.com/a/9100844/2160152至Solr - How can I receive notifications of failed imports from my DataImportHandler?中提及,您可以撰写a custom EventListener。该侦听器可以连接到您的数据库并执行截断。
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.solr.handler.dataimport.Context;
import org.apache.solr.handler.dataimport.EventListener;
public class ImportEndListener implements EventListener {
@Override
public void onEvent(Context aContext) {
Connection connection = getConnection();
try {
connection.createStatement()
.executeUpdate("TRUNCATE TABLE delete_item");
} catch (SQLException e) {
// TODO think of something better
e.printStackTrace();
} finally {
try {
connection.close();
} catch (SQLException e) {
// TODO think of something better
e.printStackTrace();
}
}
}
private Connection getConnection() {
// TODO get a connection to your database, somehow
return null;
}
}
该侦听器需要在jar文件中编译和捆绑。然后是you need to make your jar and all its' dependencies available to Solr as described in the wiki(文章是关于插件的,但对于任何自定义代码都适用)。
如博客条目“Data Import Handler – removing data from index”中所示,您可以按时间戳列deleted_at
扩展您的表格。然后,您需要扩展onDelete触发器以将当前时间插入该列。
如果你有,你可以重新制定实体中的deletedPkQuery
属性,如下所示
deletedPkQuery="SELECT id FROM deleted_item WHERE deleted_at > '${dataimporter.last_index_time}'"
这样就不需要截断表了,除非你想保存磁盘空间。