Как изменить обработчик обновлений Solr, чтобы он не просто перезаписывал существующие документы? - PullRequest
0 голосов
/ 01 марта 2012

Я работаю с индексированием данных Solr из двух источников - в режиме реального времени "насос" вставляет (и обновляет) документы в Solr и базу данных, в которой хранятся резервные копии этих документов.

Похожая проблемачто - если мы сделаем импорт данных из базы данных, когда pump выполняет вставки, мы можем индексировать документ из насоса, а затем перезаписать его документом, извлеченным из базы данных - что является резервной копией, поэтому, вероятно, он немного устарел.* Если мы закроем насос, импортируем из базы данных и снова откроем насос, это, вероятно, вызовет нестабильность в нашем приложении.

Я хотел бы сказать Solr, чтобы он не перезаписывал документ автоматически, а делалтак условно (например, по значению поля 'last_modified_date').

Мой вопрос - как я могу это сделать?Нужно ли изменять исходный код Solr, создавать новый класс, перезаписывая какой-либо процессор обновлений, или просто добавлять несколько волшебных строк в solrconfig?

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

Извините, но там нет ни опции, ни конфигурации, чтобы указать Solr не обновлять документы автоматически, а вместо этого использовать некоторую условную проверку. Текущая модель для Solr заключается в том, что если вы вставите документ с тем же уникальным идентификатором, который уже есть в индексе, он «обновит» этот документ с помощью операции удаления / добавления. Solr также в настоящее время не поддерживает возможность обновления только определенных полей в существующем проиндексированном документе. Пожалуйста, смотрите вопрос SOLR-139 для более подробной информации.

Исходя из сценария, который вы описали, я бы предложил создать за пределами Solr процесс, который обрабатывает извлечение элементов из ваших источников данных, а затем выполняет условную проверку, чтобы увидеть, что уже есть в индексе, и определить, необходимо обновить индекс.

0 голосов
/ 26 ноября 2016

Вы можете использовать обработчики скриптов 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)
    }
}
...