Elasticsearch: определение корневого сопоставления имеет неподдерживаемые параметры index: not_analyzed

Привет всем, я пытаюсь создать схему Test.

PUT /test
{
"mappings": {
            "field1":{  
                 "type":"integer"
             },
             "field2":{  
                 "type":"integer"
             },
              "field3":{  
                "type":"string",
                "index":"not_analyzed"
             },
              "field4,":{  
              "type":"string",
              "analyzer":"autocomplete",
              "search_analyzer":"standard"
           }
           },
"settings": {
            bla
            bla
            bla
            }

Я получаю следующую ошибку

            {
              "error": {
                "root_cause": [
                  {
                    "type": "mapper_parsing_exception",
                    "reason": "Root mapping definition has unsupported parameters:  [index : not_analyzed] [type : string]"
                  }
                ],
                "type": "mapper_parsing_exception",
                "reason": "Failed to parse mapping [featured]: Root mapping definition has unsupported parameters:  [index : not_analyzed] [type : string]",
                "caused_by": {
                  "type": "mapper_parsing_exception",
                  "reason": "Root mapping definition has unsupported parameters:  [index : not_analyzed] [type : string]"
                }
              },
              "status": 400
            }

Пожалуйста, помогите мне решить эту ошибку

8 ответов

Решение

Вы почти здесь, вы просто упускаете несколько вещей:

PUT /test
{
  "mappings": {
    "type_name": {                <--- add the type name
      "properties": {             <--- enclose all field definitions in "properties"
        "field1": {
          "type": "integer"
        },
        "field2": {
          "type": "integer"
        },
        "field3": {
          "type": "string",
          "index": "not_analyzed"
        },
        "field4,": {
          "type": "string",
          "analyzer": "autocomplete",
          "search_analyzer": "standard"
        }
      }
    }
  },
  "settings": {
     ...
  }
}

ОБНОВИТЬ

Если ваш индекс уже существует, вы также можете изменить свои отображения следующим образом:

PUT test/_mapping/type_name
{
    "properties": {             <--- enclose all field definitions in "properties"
        "field1": {
          "type": "integer"
        },
        "field2": {
          "type": "integer"
        },
        "field3": {
          "type": "string",
          "index": "not_analyzed"
        },
        "field4,": {
          "type": "string",
          "analyzer": "autocomplete",
          "search_analyzer": "standard"
        }
    }
}

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

Если вы используете Elastic search 7.0 и последнюю версию Nest C# (6.6). В ES 7.0 есть некоторые серьезные изменения, которые вызывают эту проблему. Это потому, что мы не можем указать тип документа и в версии 6.6 NEST они используют doctype. Таким образом, чтобы решить, что до выхода NEST 7.0, нам нужно скачать их бета-версию

Пожалуйста, пройдите по этой ссылке для исправления

https://xyzcoder.github.io/elasticsearch/nest/2019/04/12/es-70-and-nest-mapping-error.html

Проверьте свою версию Elastic.

У меня были эти проблемы, потому что я смотрел на неверную документацию версии.

Я использую Elastic Search версии 7.12.

Когда я запускаю следующую команду

      curl -H 'Content-Type: application/json' -XPUT 127.0.0.1:9200/movies?pretty -d '
{
    "mappings" : {
        "movie": {
            "properties" : {
                "year" : { "type": "date" }
            }
        }
    }   
}'

Я получаю следующую ошибку

      {
  "error" : {
    "root_cause" : [
      {
        "type" : "mapper_parsing_exception",
        "reason" : "Root mapping definition has unsupported parameters:  [movie : {properties={year={type=date}}}]"
      }
    ],
    "type" : "mapper_parsing_exception",
    "reason" : "Failed to parse mapping [_doc]: Root mapping definition has unsupported parameters:  [movie : {properties={year={type=date}}}]",
    "caused_by" : {
      "type" : "mapper_parsing_exception",
      "reason" : "Root mapping definition has unsupported parameters:  [movie : {properties={year={type=date}}}]"
    }
  },
  "status" : 400
}

Чтобы смягчить это, мне нужно изменить json в запросе следующим образом.

      curl -H 'Content-Type: application/json' -XPUT 127.0.0.1:9200/movies?pretty -d '
{
    "mappings" : {
        "properties" : {
            "year" : { "type": "date" }
        }
    }   
}'

Обратите внимание, я удалил слой "movie": {}. Теперь это работает.

Начиная с ES 7, типы отображения были удалены. Вы можете прочитать больше здесь

Если вы используете Ruby On Rails, это означает, что вам может потребоваться удалить document_type от вашей модели или концерна.

В качестве альтернативы сопоставлению типов одним из решений является использование индекса для каждого типа документа.

Перед:

module Searchable
  extend ActiveSupport::Concern

  included do
    include Elasticsearch::Model
    include Elasticsearch::Model::Callbacks
    index_name [Rails.env, Rails.application.class.module_parent_name.underscore].join('_')
    document_type self.name.downcase
  end
end

После:

module Searchable
  extend ActiveSupport::Concern

  included do
    include Elasticsearch::Model
    include Elasticsearch::Model::Callbacks
    index_name [Rails.env, Rails.application.class.module_parent_name.underscore, self.name.downcase].join('_')
  end
end
PUT /testIndex
{
    "mappings": {
        "properties": {     <--ADD THIS
            "field1": {
                "type": "integer"
            },
            "field2": {  
                "type": "integer"
            },
            "field3": {
                "type": "string",
                "index": "not_analyzed"
            },
            "field4": {
                "type": "string",
                "analyzer": "autocomplete",
                "search_analyzer": "standard"
            }
        }
    },
    "settings": {
        bla
        bla
        bla
    }
}

Вот похожая команда, которую я знаю, работает:

curl -v -H "Content-Type: application/json" -H "Authorization: Basic cGC3COJ1c2Vy925hZGFJbXBvcnABCnRl" -X PUT -d '{"mappings":{"properties":{"city":{"type": "text"}}}}' https://35.80.2.21/manzanaIndex

Разбивка приведенной выше команды curl:

PUT /manzanaIndex
{
    "mappings":{
        "properties":{
                "city":{
                    "type": "text"
                }
        }
    }
}

Если вы используете elasticsearch_dslв Python эта ошибка может просто означать, что вы используете неправильную версию библиотеки.

Версия библиотеки соответствует версии Elasticsearch.

Поэтому, если вы используете Elasticsearch, elasticsearch_dsl должен быть 7.xи так далее

Если вы используетеPython, вы также можете использоватьrequestsбиблиотека:

POST_URL = '<экземпляр_kibana>/имя_индекса/имя_типа/'

postdata = 'content_in_json_file.json'

      response = requests.request("POST", POST_URL, data=postdata, headers={'Content-Type': 'application/octet-stream'})

Проверьте статус и возврат, чтобы убедиться, что все прошло нормально:

      response.status_code

response.content
Другие вопросы по тегам