2016-02-16 8 views
1

ElasticSearch IndexКак импортировать данные в формате CSV, используя Logstash для завершения типа поля в Elasticsearch Suggester Создание

curl -XPOST 'http://localhost:9200/music/' -d '{}' 

Field Mapping

curl -XPUT 'http://localhost:9200/music/_mapping/song' -d ' 
{ 
    "properties": { 
    "name" : { 
     "type" : "string" 
    }, 
    "suggest": { 
     "type" : "completion" 
    } 
    } 
}' 

LogStash конфигурационный файл, musicStash.config

input { 
    file { 
     path => "pathToCsv" 
     start_position => beginning 
    } 
} 

filter { 
    csv { 
     columns => ["id", "name", "suggest"] 
     separator => "," 
    } 
} 

output { 
    elasticsearch { 
     hosts => "localhost" 
     index => "music" 
     document_id => "%{id}" 
    } 
} 

Теперь, выполняя файл конфигурации logstash, получил следующее исключение в elasticsearch c onsole

failed to put mappings on indices [[music]], type [logs] 
java.lang.IllegalArgumentException: Mapper for [suggest] conflicts with existing mapping in other types: 
[mapper [suggest] cannot be changed from type [completion] to [string]] 
at org.elasticsearch.index.mapper.FieldTypeLookup.checkCompatibility(FieldTypeLookup.java:117) 

И ошибка получила в logstash консоли

response=>{"index"=>{"_index"=>"music", "_type"=>"logs", "_id"=>"5", "status"=>400, 
"error"=>{"type"=>"illegal_argument_exception", 
"reason"=>"Mapper for [suggest] conflicts with existing mapping in other types:\n[mapper [suggest] cannot be changed from type [completion] to [string]]"}}}, :level=>:warn} 

Так как достичь elasticsearch автоматического заполнения путем импорта CSV-файла через Logstash.

+0

Шел, как бы вы смогли импортировать несколько рекомендаций для сингла e document при использовании логсташа в качестве отдельного помощника для каждого документа? – Birdy

ответ

3

Вы пропустили следующие настройки в вашем elasticsearch выход:

document_type => "song" 

Что происходит, что logstash создает новый тип, называемый logs (by default) и с тех пор, как в ES 2,0 запрещено иметь два поля с тем же именем, но разные типы (string vs completion) в том же индексе, это ошибка.

Просто измените такой вывод, и он будет работать:

output { 
    elasticsearch { 
     hosts => "localhost" 
     index => "music" 
     document_type => "song" 
     document_id => "%{id}" 
    } 
} 
1

Я автор elasticsearch_loader
Если вы просто хотите загрузить данные CSV в elasticsearch вы можете использовать elasticsearch_loader
После вы сможете загрузить файлы csv/json/parquet в elasticsearch, выпустив:

elasticsearch_loader \ 
    --index-settings-file mappings.json \ 
    --index completion \ 
    --type song \ 
    --id-field id \ 
    csv \ 
    input1.csv input2.csv 
+0

Как ваше решение будет работать, если вам нужно добавить несколько советов для одного документа. Например, адресный документ может иметь Line1, Line2, Line3 и Postcode в качестве справочника для одного поля адреса. – Birdy

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