ElasticSearch: «copy_to» вложенные поля

Я пытаюсь использовать атрибут ES «copy_to» для репликации поля объекта во вложенное поле, но, несмотря на многочисленные попытки, получаю сообщение об ошибке. Вот моя структура:

      ...
      "identifiedBy": {
        "type": "object",
        "properties": {
          "type": {
            "type": "keyword",
            "copy_to": "nested_identifiers.type"
          },
          "value": {
            "type": "text",
            "analyzer": "identifier-analyzer",
            "copy_to": "nested_identifiers.type"
          },
          "note": {
            "type": "text"
          },
          "qualifier": {
            "type": "keyword"
          },
          "source": {
            "type": "keyword",
            "copy_to": "nested_identifiers.type"
          },
          "status": {
            "type": "text"
          }
        }
      },
      "nested_identifiers": {
        "type": "nested",
        "properties": {
          "type": {
            "type": "keyword",
          },
          "value": {
            "type": "text",
            "analyzer": "identifier-analyzer",
          },
          "source": {
            "type": "keyword",
          }
        }
      }
      ...

Ошибка отображения

java.lang.IllegalArgumentException: Illegal combination of [copy_to] and [nested] 
mappings: [copy_to] may only copy data to the current nested document or any of its 
parents, however one [copy_to] directive is trying to copy data from nested object [null]
to [nested_identifiers]
  • Я также пытаюсь разместить «copy_to» на корневом уровне «identifiedBy»: не работает.
  • Я также пытаюсь использовать свойство «fields» в «identifiedBy» и «copy_to» этого подполя: не работает.

Кто-нибудь знает решение моей проблемы?

Спасибо за вашу помощь.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

тлдр;

Из-за того, как Elasticsearch индексировать вложенные документы. Это невозможно... без обновления отображения.

Действительно есть обходной путь, используя include_in_root: trueпараметр.

В противном случае я предлагаю вам предварительно обработать данные перед их индексацией и во время этой предварительной обработки скопировать данные во вложенное поле. Может быть, используя прием конвейера?

Прием конвейера

PUT /72270706/
{
  "mappings": {
    "properties": {
      "root_type":{
        "type": "keyword"
      },
      "nested_doc":{
        "type": "nested",
        "properties": {
          "nested_type":{
            "type": "keyword"
          }
        }
      }
    }
  }
}

PUT _ingest/pipeline/set_nested_type
{
  "processors": [
    {
      "set": {
        "field": "nested_doc.nested_type",
        "copy_from": "root_type"
      }
    }
  ]
}

POST /72270706/_doc?pipeline=set_nested_type
{
  "root_type": "a type"
}

GET /72270706/_search

Должен дать вам

{
  "took" : 392,
  "timed_out" : false,
  "_shards" : {
...
  },
  "hits" : {
...
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "72270706",
        "_id" : "laOB0YABOgujegeQNA8D",
        "_score" : 1.0,
        "_source" : {
          "root_type" : "a type",
          "nested_doc" : {
            "nested_type" : "a type"
          }
        }
      }
    ]
  }
}

Чтобы обойти

      ...
      "identifiedBy": {
        "type": "object",
        "properties": {
          "type": {
            "type": "keyword",
            "copy_to": "nested_identifiers.type"
          },
          "value": {
            "type": "text",
            "analyzer": "identifier-analyzer",
            "copy_to": "nested_identifiers.type"
          },
          "note": {
            "type": "text"
          },
          "qualifier": {
            "type": "keyword"
          },
          "source": {
            "type": "keyword",
            "copy_to": "nested_identifiers.type"
          },
          "status": {
            "type": "text"
          }
        }
      },
      "nested_identifiers": {
        "type": "nested",
        "include_in_root": true,
        "properties": {
          "type": {
            "type": "keyword",
          },
          "value": {
            "type": "text",
            "analyzer": "identifier-analyzer",
          },
          "source": {
            "type": "keyword",
          }
        }
      }
      ...

Вам нужно будет повторный индекс существующие данные.

Но имейте в виду, что copy_to не скопирует информацию во вложенный объект. Но в другое поле с тем же именем, но не вложенным.

спасибо @Paulo за ваш ответ. Я уже думал об использовании скриптового подхода. Это не большая проблема для моего проекта, поэтому я реализую это решение.

Renaud Michotte 17.05.2022 12:51

Другие вопросы по теме