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

#elasticsearch #mapping

#elasticsearch #сопоставление

Вопрос:

Я создаю способ поиска слов на тайском языке с помощью Elasticsearch и Kibana. У меня проблема с сопоставлением.

 PUT test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "trigrams": {
          "tokenizer": "trigram_tokenizer",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "trigram_tokenizer": {
          "type": "ngram",
          "min_ngram": 3,
          "max_ngram": 3,
          "token_chars": []
        }
      }
    }
  },
  "mappings": {
    "true_name": {
      "properties": {
        "correct": { "type": "text", "analyzer": "trigrams" }
      }
    }
  }
}
 

и ошибка, подобная этой

 {
  "error" : {
    "root_cause" : [
      {
        "type" : "mapper_parsing_exception",
        "reason" : "Root mapping definition has unsupported parameters:  [true_name : {properties={correct={analyzer=trigrams, type=text}}}]"
      }
    ],
    "type" : "mapper_parsing_exception",
    "reason" : "Failed to parse mapping [_doc]: Root mapping definition has unsupported parameters:  [true_name : {properties={correct={analyzer=trigrams, type=text}}}]",
    "caused_by" : {
      "type" : "mapper_parsing_exception",
      "reason" : "Root mapping definition has unsupported parameters:  [true_name : {properties={correct={analyzer=trigrams, type=text}}}]"
    }
  },
  "status" : 400
}

 

Ответ №1:

Типы сопоставления устарели. Обратитесь к этой документации, чтобы узнать больше об удалении типов сопоставления.

Индексы, созданные в Elasticsearch 6.0.0 или более поздней версии, могут содержать только один тип сопоставления. Индексы, созданные в 5.x с несколькими типами сопоставления, будут продолжать функционировать, как и раньше, в Elasticsearch 6.x. Типы будут устаревшими в API в Elasticsearch 7.0.0 и полностью удалены в 8.0.0.

 {
  "settings": {
    "analysis": {
      "analyzer": {
        "trigrams": {
          "tokenizer": "trigram_tokenizer",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "trigram_tokenizer": {
          "type": "ngram",
          "min_ngram": 3,
          "max_ngram": 3,
          "token_chars": []
        }
      }
    }
  },
  "mappings": {            // note this
    "properties": {
      "correct": {
        "type": "text",
        "analyzer": "trigrams"
      }
    }
  }
}
 

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

 {
  "true_name": {
    "correct": "mapping types deprecated"
  }
}
 

Тогда сопоставление индексов будет —

 {
  "settings": {
    "analysis": {
      "analyzer": {
        "trigrams": {
          "tokenizer": "trigram_tokenizer",
          "filter": [
            "lowercase"
          ]
        }
      },
      "tokenizer": {
        "trigram_tokenizer": {
          "type": "ngram",
          "min_ngram": 3,
          "max_ngram": 3,
          "token_chars": []
        }
      }
    }
  },
  "mappings": {
    "properties": {              // note this
      "true_name": {
        "properties": {
          "correct": {
            "type": "text",
            "analyzer": "trigrams"
          }
        }
      }
    }
  }
}