1

我做增量数据导入。我使用 delete_item 表来获取数据,我应该从 solr 索引中删除它。

如何执行查询

TRUNCATE TABLE delete_item

在执行增量导入之后。

它可以用 solr 来做,或者我应该用 cron 作业来做。

4

1 回答 1

3

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

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

1.自定义事件监听器

就像在这个答案中提到的那样https://stackoverflow.com/a/9100844/2160152Solr - 如何从我的 DataImportHandler 接收导入失败的通知?您可以编写自定义 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 文件中。然后,您需要使您的 jar 及其所有依赖项对 Solr 可用,如 wiki 中所述(这篇文章是关于插件的,但适用于任何自定义代码)。

2.重新设计'deleted_item'表

如博客条目“数据导入处理程序 - 从索引中删除数据”中所示,您可以通过时间戳列扩展您的表deleted_at。然后您需要扩展您的 onDelete 触发器以将当前时间插入该列。

如果你有,你可以重新格式化deletedPkQuery你的实体中的属性,如下所示

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

这样就不需要截断表,除非你想节省磁盘空间。

于 2013-10-29T15:31:39.653 回答