Обновить новое поле в существующем документе
есть ли возможность обновить новое поле в существующем документе?
Например:
Существует документ с несколькими полями, например
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"
}