Недавно мы начали изучать частичные обновления индекса Solr.
API для полных и частичных обновлений выглядит примерно так. Вместо
doc.addField("location", "UK")
solrClient.add(doc)
вы должны написать
doc.addField("location", map("set", "Germany"))
solrClient.add(doc)
Что я ожидал: solr обновит инвертированный индекс для поля "location"
Что на самом деле происходит:
- solr загружает сохраненные поля для документа
- применяет данные обновления для документа
- удаляет документ с идентификатором
- записывает документ в индекс
В результате все несохраненные поля теряются.
Я нашел несколько старых обсуждений в списках рассылки, люди говорят, что это ожидаемое поведение, вам нужно сохранить все поля и т. Д. , Мы не хотим, чтобы все поля были сохранены. Свойство «Сохранено» было разработано для полей, которые должны быть возвращены в ответ от Solr вызывающей стороне. Нам нужна только небольшая мета-информация в ответах, поэтому все сохраненные поля выглядят как излишние.
Вопрос в том, почему solr / lucene выполняет все эти шаги для выполнения частичного обновления? В моем понимании, каждое поле имеет свой собственный инвертированный индекс, расположенный в своем собственном файле, поэтому должна быть возможность обновлять поля независимо. Судя по тому, что на самом деле происходит, solr / lucene не может обновить индекс для одного поля, и я не могу найти причину для этого.
Обсуждения на эту тему c: