如何在Solr上完成delta-import后执行查询

时间:2013-10-29 09:56:43

标签: solr dataimporthandler

我做delta dataimport。 我使用delete_item表来获取数据,我应该从solr索引中删除它。

如何执行查询

TRUNCATE TABLE delete_item

执行delta导入后。

可以使用solr,或者我应该使用cron作业。

1 个答案:

答案 0 :(得分:3)

没有开箱即用,为此配置我的XML解决方案。从Solr的角度来看,这是有道理的。 Solr希望自我管理而不管理其他数据源。但你可以做几件事。

我个人建议(2)因为这不包括编写需要部署到solr实例的自定义代码。因此,该解决方案可转移到solr云。

1。自定义EventListener

在此回答https://stackoverflow.com/a/9100844/2160152Solr - 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(文章是关于插件的,但对于任何自定义代码都适用)。

2。重新签名'deleted_item'表

如博客条目“Data Import Handler – removing data from index”中所示,您可以按时间戳列deleted_at扩展您的表格。然后,您需要扩展onDelete触发器以将当前时间插入该列。

如果你有,你可以重新制定实体中的deletedPkQuery属性,如下所示

deletedPkQuery="SELECT id FROM deleted_item WHERE deleted_at > '${dataimporter.last_index_time}'"

这样就不需要截断表了,除非你想保存磁盘空间。