Импорт и обновление данных в Elasticsearch

У нас есть существующая функция поиска, которая включает данные по нескольким таблицам в SQL Server. Это вызывает большую нагрузку на нашу БД, поэтому я пытаюсь найти лучший способ поиска по этим данным (это не меняется очень часто). Я работаю с Logstash и Elasticsearch около недели, используя импорт, содержащий 1,2 миллиона записей. Мой вопрос по существу: "Как обновить существующие документы с помощью моего" первичного ключа "?

Файл данных CSV (с разделителями каналов) выглядит следующим образом:

369|90045|123 ABC ST|LOS ANGELES|CA
368|90045|PVKA0010|LA|CA
367|90012|20000 Venice Boulvd|Los Angeles|CA
365|90045|ABC ST 123|LOS ANGELES|CA
363|90045|ADHOCTESTPROPERTY|DALES|CA

Моя конфигурация logstash выглядит следующим образом:

input {
  stdin {
    type => "stdin-type"
  }

  file {
    path => ["C:/Data/sample/*"]
    start_position => "beginning"
  }
}

filter {
  csv {
    columns => ["property_id","postal_code","address_1","city","state_code"]
    separator => "|"
  }
}

output {
  elasticsearch {
    embedded => true
    index => "samples4"
    index_type => "sample"
  }
}

Документ в поиске elasticsearch выглядит следующим образом:

{
   "_index": "samples4",
   "_type": "sample",
   "_id": "64Dc0_1eQ3uSln_k-4X26A",
   "_score": 1.4054651,
   "_source": {
   "message": [
      "369|90045|123 ABC ST|LOS ANGELES|CA\r"
   ],
   "@version": "1",
   "@timestamp": "2014-02-11T22:58:38.365Z",
   "host": "[host]",
   "path": "C:/Data/sample/sample.csv",
   "property_id": "369",
   "postal_code": "90045",
   "address_1": "123 ABC ST",
   "city": "LOS ANGELES",
   "state_code": "CA"
}

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

Параметр document_id для вывода elasticsearch не помещает это значение поля в _id (он просто помещается в "property_id" и только сохраняет/обновляет один документ). Я знаю, что здесь что-то не хватает. Я просто ошибаюсь?

РЕДАКТИРОВАТЬ: РАБОТА!

Используя предложение @rutter, я обновил конфигурацию output:

output {
  elasticsearch {
    embedded => true
    index => "samples6"
    index_type => "sample"
    document_id => "%{property_id}"
  }
}

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

{
   "_index": "samples6",
   "_type": "sample",
   "_id": "351",
   "_score": 1,
   "_source": {
   "message": [
      "351|90045|Easy as 123 ST|LOS ANGELES|CA\r"
   ],
   "@version": "1",
   "@timestamp": "2014-02-12T16:12:52.102Z",
   "host": "TXDFWL3474",
   "path": "C:/Data/sample/sample_update_3.csv",
   "property_id": "351",
   "postal_code": "90045",
   "address_1": "Easy as 123 ST",
   "city": "LOS ANGELES",
   "state_code": "CA"
}

Ответы

Ответ 1

Преобразование из комментария:

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

Вы можете установить идентификатор, используя поле выходного плагина document_id, но оно принимает литеральную строку, а не имя поля. Чтобы использовать содержимое поля, вы можете использовать строку формата sprintf, например %{property_id}.

Что-то вроде этого, например:

output {
  elasticsearch {
    ... other settings...
    document_id => "%{property_id}"
  }
}

Ответ 2

declaimer - Я автор ESL
Вы можете использовать elasticsearch_loader для загрузки файлов psv в elasticsearch.
Чтобы установить поле _id, вы можете использовать -id-field = property_id. например:
elasticsearch_loader --index=myindex --type=mytype --id-field=property_id csv --delimiter='|' filename.csv

Ответ 3

Вы пытались изменить конфигурацию на это:

filter {
  csv {
    columns => ["_id","postal_code","address_1","city","state_code"]
    separator => "|"
  }
}

Именование свойства_id как _id должно использоваться при индексировании.