У нас есть существующая функция поиска, которая включает данные по нескольким таблицам в SQL Server. Это вызывает большую нагрузку на нашу БД, поэтому я пытаюсь найти лучший способ поиска по этим данным (это не меняется очень часто). Я работаю с Logstash и Elasticsearch около недели, используя импорт, содержащий 1,2 миллиона записей. Мой вопрос по существу: «Как мне обновлять существующие документы с помощью моего« первичного ключа »?Импорт и обновление данных в Elasticsearch
файл 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"
}
I думаю, что хотел бы уникальный идентификатор в _id
, которое должно быть заменено на значение property_id
. Идея заключается в том, что последующие файлы данных будут содержать обновления. Мне не нужно сохранять предыдущие версии, и не было бы случая, когда мы добавили или удалили ключи из документа.
Установка document_id
для вывода результатов elasticsearch не помещает значение этого поля в _id
(оно просто помещено в "property_id" и только хранится/обновляется один документ). Я знаю, что здесь что-то не хватает. Я просто ошибаюсь?
EDIT: WORKING!
Используя предложение @ Раттер, я уже обновил output
конфигурации этого:
output {
elasticsearch {
embedded => true
index => "samples6"
index_type => "sample"
document_id => "%{property_id}"
}
}
Now documents are updating by dropping new files into the data folder as expected. _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"
}
Вы можете переписать документ, отправив еще один документ с тем же ID ... но это может быть сложно с предыдущими данными, так как вы получите рандомизированные идентификаторы по умолчанию. Вы можете установить идентификатор, используя поле 'document_id' выходного фильтра, но оно принимает литеральную строку, а не имя поля. Чтобы использовать содержимое поля, вы можете использовать [строку формата sprintf] (http://logstash.net/docs/1.3.3/configuration#sprintf), например '% {property_id}'. – rutter
@rutter - Можете ли вы создать ответ, используя строку формата sprintf, чтобы я мог отметить ее правильно? Это сработало отлично. Спасибо. –
Я рад, что помог! Ответ [отправлен] (http://stackoverflow.com/a/21738549/1251354). – rutter