Ключи Elasticsearch с именами, которые являются подстроками друг друга - PullRequest
2 голосов
/ 03 июля 2019

Я играю с Elasticsearch около дня, поэтому я очень новичок.Я пытаюсь POST / импортировать простой документ:

{
    "compression" : "none",
    "compression.level" : "0"
}

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

{
"error": {
"root_cause": [
  {
"type": "mapper_parsing_exception",
"reason": "object mapping for [compression] tried to parse field [compression] as object, but found a concrete value"
}
],
"type": "mapper_parsing_exception",
"reason": "object mapping for [compression] tried to parse field [compression] as object, but found a concrete value"
},
"status": 400
}

Насколько я понимаю, Elasticsearch сначала увидит "compression" : "none" исоздать ключ с именем compression типа строка?Затем, когда он видит "compression.level" : "0", он видит это как "сжатие" ключа с ... значением объекта .level" : "0"?Или ... я действительно не знаю.

Как я мог заставить это работать так, как ожидалось?Или почему это не работает так, как я ожидал?

Спасибо!

1 Ответ

4 голосов
/ 03 июля 2019

compression имеет тип object, и вы пытаетесь передать значение string, которое вы не можете напрямую передать. И ниже сообщение об ошибке объясняет это правильно.

объектное сопоставление для [сжатия] пыталось проанализировать поле [сжатие] как объект, но нашел конкретное значение

Тип объекта может иметь несколько sub-fields, которые обозначены ., и вы можете передать отдельное значение этим подполям. Так что в вашем случае вы можете передать значение compression.level.

Пожалуйста, обратитесь к официальному документу ES для более подробного объяснения и примеров. https://www.elastic.co/guide/en/elasticsearch/reference/current/object.html

Похоже, что вы используете динамическое отображение, в этом случае, когдаasticsearch видит имя поля с ., тогда, если есть соответствующее поле с тем же именем, но без ., то оно автоматически преобразует его в object типа, что происходит в вашем случае.

Дайте мне знать, что вам нужно, если вам нужен ключ для вашего значения none, тогда вам нужно создать такой документ, как:

{
    "compression.stategy" : "none", // notice its a another sub-field. 
    "compression.level" : "0"
}

И вы можете проверить все подполя, нажав _mapping https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-mapping.html

Согласно вашему пониманию (если вы используете динамическое отображение), оно немного отличается, ES сначала увидит "compression" : "none", затем попытается сопоставить его с текстовым полем, но затем увидит другое поле compression.level и как он использует . в имени поля, а compression уже присутствует, поэтому начинайте обрабатывать compression как тип объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...