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

я пытаюсь выполнить обновление индекса документов в моем индексе elasticsearch.

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

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

каждый раз, когда я хочу обновить соответствующую запись в индексе или добавить ее, если она в настоящее время не существует...

в моем цикле я пытаюсь использовать такой код для обновления...

client.Update<MyContentClass>(u => u
                .Id("AU-7zORce3_kxnyDoVLv")
                .Index("qubecontent")
                //.Doc(new MyContentClass { ESUniqueKey = MyContentClassInstance.ESUniqueKey })
                .DocAsUpsert()
                .Refresh()
                );

я не уверен, что Id ссылается? это идентификатор, который elasticsearch автоматически генерирует для каждой проиндексированной записи? Я создаю дополнительный уникальный идентификатор в своем классе, но не знаю, как я могу ссылаться на него?

Может ли кто-нибудь посоветовать, как выполнить это обновление индекса для измененной записи?


person user2895142    schedule 11.09.2015    source источник


Ответы (1)


Поле идентификатора в upsert действительно ссылается на внутренний идентификатор ElasticSearch (представьте, что это первичный ключ для ES). Если у вас уже есть собственный уникальный первичный ключ, вы также можете использовать его в качестве первичного ключа в ES. Возьмите эти примеры:

Пример 1: Позвольте ES сгенерировать свой собственный идентификатор

POST test/type1
{
  "f1": "record 1",
  "f2": "2000-01-01"
}

Результат 1:

{
   "_index": "test",
   "_type": "type1",
   "_id": "AU--Dz-Kl6g2APRJ9y7l",
   "_version": 1,
   "created": true
}

Вы можете видеть, что ES сгенерировал собственный первичный ключ «AU--Dz-Kl6g2APRJ9y7l».

Пример 2: укажите свой собственный идентификатор

POST test/type1/thisIsMyID
{
  "f1": "record 1",
  "f2": "2000-01-01"
}

Результат 2:

{
   "_index": "test",
   "_type": "type1",
   "_id": "thisIsMyID",
   "_version": 1,
   "created": true
}

Обратите внимание, как в примере 2 использовался указанный мной идентификатор. Как только вы используете тот же первичный ключ, что и ES, вы можете запустить оператор upsert.

ПРИМЕЧАНИЕ. Если вы регенерируете весь документ и на самом деле хотите перезаписать старый, а не вставить старый. Затем вы можете снова просто отправить сообщение с тем же идентификатором, и старая запись будет перезаписана новой записью. Перезапись будет НАМНОГО быстрее, чем вставка.

person jhilden    schedule 11.09.2015