2014-02-12 3 views
16

У нас есть существующая функция поиска, которая включает данные по нескольким таблицам в 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" 
}

+2

Вы можете переписать документ, отправив еще один документ с тем же ID ... но это может быть сложно с предыдущими данными, так как вы получите рандомизированные идентификаторы по умолчанию. Вы можете установить идентификатор, используя поле 'document_id' выходного фильтра, но оно принимает литеральную строку, а не имя поля. Чтобы использовать содержимое поля, вы можете использовать [строку формата sprintf] (http://logstash.net/docs/1.3.3/configuration#sprintf), например '% {property_id}'. – rutter

+0

@rutter - Можете ли вы создать ответ, используя строку формата sprintf, чтобы я мог отметить ее правильно? Это сработало отлично. Спасибо. –

+0

Я рад, что помог! Ответ [отправлен] (http://stackoverflow.com/a/21738549/1251354). – rutter

ответ

13

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

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

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

Нечто подобное, например:

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

Спасибо. В вопрос добавлен рабочий код и вывод. –

0

Вы пробовали изменения конфигурации к этому:

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

Называя PROPERTY_ID, как _id он должен привыкнуть во время индексации.

+0

Я должен был упомянуть, что я попробовал это. По какой-то причине он вообще не запускал импорт. –

+0

Этот ответ неверен. Он возвращает следующую ошибку: 'org.elasticsearch.index.mapper.MapperParsingException: не удалось проанализировать [_id]' – eliasah

1

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

Смежные вопросы