Как обновить сопоставление в Elasticsearch, чтобы изменить тип данных поля и изменить тип анализаторов в строке

при попытке обновить отображение я получаю следующую ошибку:

{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"mapper [timestamp] of different type, current_type [string], merged_type [date]"}],"type":"illegal_argument_exception","reason":"
mapper [timestamp] of different type, current_type [string], merged_type [date]"},"status":400}

Я пытаюсь запустить следующую команду в Windows

   curl -XPUT localhost:9200/logstash-*/_mapping/log?update_all_types -d "{
    "properties":
    {
        "timestamp": 
        {
            "type": "date", 
            "format": "MM-dd-yyyy HH:mm:ss",
            "fielddata":{"loading" : "lazy"} }
        }
    }";

как я могу изменить тип данных поля даты из строки В тип даты с определенным форматом.

Я попытался изменить отображение строкового типа данных, чтобы изменить его на eager загрузка и not_analyzed из анализируемого, но он дает следующую ошибку:

{"root_cause":[{"type":"illegal_argument_exception","reason":"Mapper for [AppName] conflicts with existing mapping in other types:n[mapper [AppName] has different [index] values, mapper [App
 different [doc_values] values, cannot change from disabled to enabled, mapper [AppName] has different [analyzer]]"}],"type":"illegal_argument_exception","reason":"Mapper for [AppName] conflict with
existing mapping in other types:n[mapper [AppName] has different [index] values, mapper [AppName] has different [doc_values] values, cannot change from disabled to enabled, mapper [AppName]
rent [analyzer]]"},"status":400}

вот мой запрос же:

 curl -XPUT localhost:9200/logstash-*/_mapping/log?update_all_types -d "{
"properties":
    {"AppName":
        {
        "type": "string", 
        "index" : "not_analyzed",
        "fielddata":{"loading" : "eager"}
        }
    }
}"

однако, если я изменю его с not_analyzed to analyzed выдает acknowledged=true сообщение. Как я могу изменить анализатор.

2 ответов


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

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

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

ваш единственный вариант-создать новый индекс с новым сопоставлением и переиндексировать данные из старого индекса в новый.


нет, вы не можете изменить определение поля.

если вы хотите изменить определение поля для одного поля в одном типе, у вас мало вариантов, кроме как переиндексировать все документы в вашем индексе.


почему вы не можете изменить отображения? в этой статье изменение отображения с нулевым временем простоя объясняет,

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

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

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


что происходит, когда вы индексируете документ с неправильным типом поля?

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

Elasticsearch: Окончательное Руководство имеет Примечание относительно примера, a string вводится, но есть. Будет предпринята попытка преобразования. Но исключение будет выдано, если нет действительного преобразования существует.

[...] если поле уже отображается как тип long, затем ES попытается преобразовать строку в длинный, и бросить исключение, если он не может.


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

да. В ES5 предоставляет