Динамический шаблон Elasticsearch: не нужно анализировать поле, нужно только подполе ключевого слова
Мы используем динамический шаблон, чтобы указать отображение для определенных полей в нашем индексе. Большинство текстовых полей не упоминаются в шаблоне и получают сопоставление по умолчанию с анализируемым полем и подполем ключевого слова:
"someField" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
}
и это хорошо.
В индексе есть несколько полей, которые мы не хотим анализировать, просто сделаны ключевые слова. Однако, для согласованности, мы хотим, чтобы все поля ключевых слов были подполем с именем "ключевое слово", как указано выше. Итак, это:
"dynamic_templates" : [
{
"someField" : {
"match" : "someField",
"mapping" : {
"type" : "keyword",
"norms" : false
}
}
},
не подходит, так как делает само слово someField ключевым словом, и мы хотим, чтобы поле someField.keyword было ключевым словом. Но если я использую этот шаблон:
"dynamic_templates" : [
{
"someField" : {
"match" : "someField",
"mapping" : {
"fields": {
"keyword": {
"type": "keyword",
"norms" : false
}
}
}
}
},
создается проанализированное поле "верхнего уровня", а также подполе ключевого слова:
"someField" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
},
Есть ли способ не отображать поле "someField", только "someField.keyword"? Я мог бы установить index: false для уровня "someField", но пользователи все еще могут пытаться использовать его, и удивляться, почему он не работает.
РЕДАКТИРОВАТЬ: я пытался определить someField как тип объекта, как это предлагается haltabush, но получить ошибку. Используя этот шаблон:
{
"template": "test*",
"order": 1,
"mappings" : {
"_default_" : {
"dynamic_templates" : [
{
"someField" : {
"match" : "someField",
"mapping" : {
"type" : "object",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
]
}
}
}
Когда я публикую этот документ:
curl -XPUT localhost:9200/test-1/doc/1?pretty -d '
{
"someField" : "some value"
}
'
Я получаю эту ошибку:
{
"error" : {
"root_cause" : [
{
"type" : "mapper_parsing_exception",
"reason" : "object mapping for [someField] tried to parse field [someField] as object, but found a concrete value"
}
],
"type" : "mapper_parsing_exception",
"reason" : "object mapping for [someField] tried to parse field [someField] as object, but found a concrete value"
},
"status" : 400
}
1 ответ
Вы можете создать объект:
"someField" : {
"type" : "object",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
},