如何修改Solr更新处理程序而不是简单地覆盖现有文档?

时间:2012-03-01 07:14:52

标签: solr solrj

我正在使用Solr索引来自两个来源的数据 - 实时“泵”插入(和更新)文档到Solr和数据库,该数据库保存这些文档的备份。

我们遇到的问题看起来如此 - 如果我们在泵执行插入时从数据库导入数据,我们可以从泵索引doc,然后用从数据库中提取的doc覆盖它 - 这是一个备份,所以它是可能很少过时。

如果我们关闭泵,从数据库导入并再次打开泵,可能会导致我们的应用程序不稳定。

我想要做的是告诉Solr不要自动覆盖文档,但要有条件地执行(例如通过'last_modified_date'字段的值)。

我的问题是 - 我该怎么做?我是否必须修改Solr源,使新类覆盖某些更新处理器,或者只是为solrconfig添加一些魔术线?

2 个答案:

答案 0 :(得分:2)

很抱歉,但是没有选项或配置告诉Solr不自动更新文档,而是使用一些条件检查。 Solr的当前模型是,如果您插入的文档与索引中已有的文档具有相同的唯一ID,它将通过删除/添加操作“更新”该文档。 Solr目前还不支持仅更新现有索引文档中的特定字段的功能。有关详细信息,请参阅问题SOLR-139

根据您描述的场景,我建议您在Solr之外创建一个处理数据源中项目检索的流程,然后执行条件检查以查看索引中的内容并确定是否存在更新索引是必要的。

答案 1 :(得分:0)

您可以使用solr脚本处理器检查该文档是否按照其符合进行检查

下面的代码仅在solr使用java 8

时有效
function processAdd(cmd) {

    doc = cmd.solrDoc;
    var previousDoc=null;

    try {

        // create a term type object
        var Term = Java.type("org.apache.lucene.index.Term");
        var TermObject =new Term("fieldForSearchTryUnique","Value of field");

        //retrieve document id from solr return -1 if not present
        previousDocId= req.getSearcher().getFirstMatch(TermObject);

        if(-1!=perviousDocId) {
            // get complete document from solr for that searched field
            previousDoc=req.getSearcher().doc(previousDocId);
            // do required process here 
        }
    }
    catch(err) {
        logger.error("error in update processor "+err)
    }
}