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