Обновить новое поле в существующем документе

есть ли возможность обновить новое поле в существующем документе? Например: Существует документ с несколькими полями, например

ID=99999
Field1:text
Field2:text

Этот документ уже находится в индексе, теперь я хочу вставить новое поле в этот документ БЕЗ старых данных:

ID=99999
Field3:text

Теперь старый документ будет удален, и будет создан новый документ с идентификатором. Поэтому, если я теперь ищу ID 99999, результат будет:

ID=99999
Field3:text

Я читал об этом в Solr Wiki

Как обновить конкретное поле существующего документа?

Я хочу обновить определенное поле в документе, возможно ли это? Мне нужно только индексировать одно поле для > конкретного документа. Нужно ли индексировать весь документ для этого?

Нет, только один документ. Скажем, у вас есть CMS, и вы редактируете один документ. Вам нужно будет переиндексировать этот документ только с помощью инструкции add solr для всего документа (не только для одного поля).

В Lucene для обновления документа операция действительно является удалением, за которым следует добавление. Вам понадобится > , чтобы добавить полный документ, поскольку в Lucene нет семантики "обновлять только поле".

Так есть ли решение для этого? Будет ли эта функция реализована в следующей версии (в настоящее время я использую 3.6.0). В качестве обходного пути я подумал о написании script или приложения, которое будет собирать существующие поля, добавлять новое поле и обновлять весь документ. Но я думаю, что это пострадает от производительности. У вас есть другие идеи?

С наилучшими пожеланиями

Ответ 1

У меня есть для вас 2 ответа (оба более или менее плохие):

  • Для обновления, внесенного в документ в Solr, вы должны переиндексировать весь документ (чтобы обновить поле 3 в документе ID: 99999, вы должны повторно проиндексировать этот документ со значениями для всех полей)
  • В Solr 4 они реализовали такую ​​функцию, но у них есть условие: все поля должны храниться, а не просто индексироваться. Случается, что они используют сохраненные значения и переиндексируют документ в фоновом режиме. Если вам интересно, есть хорошая статья об этом: http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/ Это решение имеет очевидный недостаток, и это размер индекса, когда вы храните все поля.

Я надеюсь, что это поможет вам в решении вашей проблемы. Если у вас есть еще несколько вопросов, пожалуйста, спросите

Ответ 2

Это можно сделать в Solr 4. Например. Рассмотрим следующий документ

{
 "id": "book123",
 "name" : "Solr Rocks"
}

Чтобы добавить в документ поле автора, значением поля будет json-объект с атрибутом "set" и значением поля

$ curl http://localhost:8983/solr/update -H 'Content-type:application/json' -d '
[
 {"id"       : "book123",
  "author"   : {"set":"The Community"}
 }
]'

Ваш новый документ

$ curl http://localhost:8983/solr/get?id=book123

будет

{
 "doc" : {
    "id"    : "book123",
    "name"  : "Solr Rocks"
    "author": "The Community"
 }
}

Set добавит или заменит поле автора. Наряду с настройкой у вас также есть опция для увеличения (inc) и добавления (добавления)

Ответ 3

Из Solr 4 и далее вы можете обновить поле в solr.... нет необходимости переиндексации всех индексов.... различные модификаторы поддерживаются как....

set - установить или заменить определенное значение или удалить значение, если значение null указано как новое значение add - добавляет дополнительное значение в список remove - удаляет значение (или список значений) из списка removeregex - удаляет из списка, которые соответствуют данному регулярному выражению Java inc - увеличивает числовое значение на определенную величину (используйте отрицательное значение для уменьшения)

пример:

document

{
 "id": "1",
 "name" : "Solr"
 "views" : "2"
}

обновить с помощью

$ curl http://localhost:8983/solr/demo/update -d '
[
 {"id"         : "1",
  "author"   : {"set":"Neal Stephenson"},
  "views"   : {"inc":3},
  }
]' 

приведет к

{
 "id": "1",
 "name" : "Solr"
 "views" : "5"
 "author" : "Neal Stephenson"
}