Динамический шаблон 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"
                          }
                        }
                      },
Другие вопросы по тегам