2

Если несколько типов в индексе Elasticsearch имеют поля с тем же именем, эти поля должны иметь одно и то же отображение, которое пытается создать свойство «foobar» как строковое, так и длинное »...Почему поля, указанные типом, а не индексом в Elasticsearch?

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

{ 
    "mappings": { 
    "type_one": { 
     "properties": { 
     "foobar": { 
      "type": "string" 
     } 
     } 
    }, 
    "type_two": { 
     "properties": { 
     "foobar": { 
      "type": "long" 
     } 
     } 
    } 
    } 
} 

... следующая ошибка будет возвращена

{ 
    "error": { 
    "root_cause": [ 
     { 
     "type": "mapper_parsing_exception", 
     "reason": "Failed to parse mapping [type_one]: mapper [foobar] cannot be changed from type [long] to [string]" 
     } 
    ], 
    "type": "mapper_parsing_exception", 
    "reason": "Failed to parse mapping [type_one]: mapper [foobar] cannot be changed from type [long] to [string]", 
    "caused_by": { 
     "type": "illegal_argument_exception", 
     "reason": "mapper [foobar] cannot be changed from type [long] to [string]" 
    } 
    }, 
    "status": 400 
} 

Ниже с сайта elasticsearch:

Conflicts between fields in different types

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

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

Например что-то вроде этого:

{ 
    "fields":{ 
     "PropA":{ 
     "type":"string" 
     }, 
     "PropB":{ 
     "type":"long" 
     }, 
     "PropC":{ 
     "type":"boolean" 
     } 
    }, 
    "types":{ 
     "foo":[ 
     "PropA", 
     "PropB" 
     ], 
     "foo":[ 
     "PropA", 
     "PropC" 
     ], 
     "foo":[ 
     "PropA", 
     "PropC", 
     "PropC" 
     ] 
    } 
} 

Не будет ли формат отображения, как это будет более емким, и лучшее представление о том, что на самом деле разрешено?

Причина, по которой я прошу, заключается в том, что я работаю над созданием файла JSON-шаблона индекса с примерно 80 различными полями, используемыми в 15 типах. Многие из полей используются для нескольких, если не всех типов. Поэтому в любое время, когда мне нужно обновить поле, я должен убедиться, что обновляю его для каждого типа, где он используется.

ответ

0

Похоже, я не единственный, кто нашел это запутанным.

Remove support for types? #15613

Похоже, удаление поддержки нескольких типов в индекс и определение поля на уровне индекса находится на roadmap for future versions.