Symfony Elastic mapping

У меня есть сопоставление для сущности для поля "навыки"

 * @ORM\Column(name="skills", type="array", nullable=true)
 * @Groups({"for_profile_project"})
 */
private $skills = [];

эластичный конфиг (это мой весь конфиг постебин)

команды:

    indexes:
    profile:
        finder: ~
        types:
            team:
                 mappings:
                     id:
                       type: integer
                     slug:
                       type: string
                   projects:
                        type: "nested"
                        properties:
                             id: ~
                             title:
                                type: string
                             description:
                                type: string
                             skills:
                                expose: true
                 persistence:
                      driver: orm
                      model: Artel\ProfileBundle\Entity\Teams
                      provider: ~
                      listener:
                        immediate: true
                      finder: ~

а в БД у меня вот так

a:5:{i:0;a:2:{s:4:"lang";s:10:"JavaScript";s:7:"percent";d:44.169475214305216;}i:1;a:2:{s:4:"lang";s:3:"CSS";s:7:"percent";d:37.235383527019629;}i:2;a:2:{s:4:"lang";s:3:"PHP";s:7:"percent";d:10.312846145221229;}i:3;a:2:{s:4:"lang";s:4:"HTML";s:7:"percent";d:8.1084777328220206;}i:4;a:2:{s:4:"lang";s:10:"ApacheConf";s:7:"percent";d:0.17381738063190688;}}

и когда я обновляю сущность, у меня появляется ошибка

Merging dynamic updates triggered a conflict: mapper [projects.skills.percent] of different type, current_type [double], merged_type [long]

какой тип мне нужен для полевых навыков или как исправить упругий конфиг? что не так с моим конфигом?

Я удалил все Inde в моей команде упругости и запуска

app/console fos:elastica:populate --no-reset

и теперь у меня есть это отображение

"team": {
"properties": {
  "skills": {
    "type": "string"
  },
  "webSite": {
    "type": "string"
  },
  "createdAt": {
    "format": "strict_date_optional_time||epoch_millis",
    "type": "date"
  },
  "projects": {
    "properties": {
      "cost": {
        "type": "long"
      },
      "authorId": {
        "properties": {
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "id": {
            "type": "long"
          },
          "username": {
            "type": "string"
          }
        }
      },
      "skills": {
        "type": "string"
      },
      "status": {
        "type": "string"
      }
    }
  },

и теперь я создаю тестовый проект с одним навыком (a:1:{i:0;s:6:"skill";}), но автоматически не загружаю в эластичный файл только при редактировании команды объекта или команды запуска

app/console fos:elastica:populate --no-reset

и когда я добавляю реальный проект с

a:5:{i:0;a:2:{s:4:"lang";s:10:"JavaScript";s:7:"percent";d:44.169475214305216;}i:1;a:2:{s:4:"lang";s:3:"CSS";s:7:"percent";d:37.235383527019629;}i:2;a:2:{s:4:"lang";s:3:"PHP";s:7:"percent";d:10.312846145221229;}i:3;a:2:{s:4:"lang";s:4:"HTML";s:7:"percent";d:8.1084777328220206;}i:4;a:2:{s:4:"lang";s:10:"ApacheConf";s:7:"percent";d:0.17381738063190688;}}

и беги

app/console fos:elastica:populate --no-reset

или когда я добавляю для этой команды разработчиков сущностей сущности команду, у меня появляется ошибка:

Notice: Array to string conversion

mapper_parsing_exception

failed to parse [projects.skills]

illegal_argument_exception

unknown property [lang]

Я пытаюсь установить процент как целое число, но все еще есть ошибка

a:5:{i:0;a:2:{s:4:"lang";s:10:"JavaScript";s:7:"percent";d:44;}i:1;a:2:{s:4:"lang";s:3:"CSS";s:7:"percent";d:37;}i:2;a:2:{s:4:"lang";s:3:"PHP";s:7:"percent";d:10;}i:3;a:2:{s:4:"lang";s:4:"HTML";s:7:"percent";d:8;}i:4;a:2:{s:4:"lang";s:10:"ApacheConf";s:7:"percent";d:0;}}

я попробую

                                 skills:
                                  expose: true
                                  properties:
                                      lang:
                                          type: string
                                      percent:
                                          type: double

но все еще есть

      Notice: Array to string conversion

mapper_parsing_exception

failed to parse [projects.skills]

illegal_argument_exception

unknown property [lang]                       

ОБНОВИТЬ

Теперь я удалил индекс и изменил конфигурацию следующим образом:

                                skills:
                                  properties:
                                      lang:
                                          type: string
                                      percent:
                                          type: double

и в упругой

          "skills": {
        "properties": {
          "lang": {
            "type": "string"
          },
          "percent": {
            "type": "double"
          }
        }
      },

и когда я загружаю сущность с полевыми навыками, как это:

a:5:{i:0;a:2:{s:4:"lang";s:10:"JavaScript";s:7:"percent";d:44.169475214305216;}i:1;a:2:{s:4:"lang";s:3:"CSS";s:7:"percent";d:37.235383527019629;}i:2;a:2:{s:4:"lang";s:3:"PHP";s:7:"percent";d:10.312846145221229;}i:3;a:2:{s:4:"lang";s:4:"HTML";s:7:"percent";d:8.1084777328220206;}i:4;a:2:{s:4:"lang";s:10:"ApacheConf";s:7:"percent";d:0.17381738063190688;}}

все хорошо, но когда я создаю сущность с полем

a:1:{i:0;s:8:"skills23";}

У меня ошибка

ОБНОВИТЬ

                             skills:
                               expose: true
                             github:
                                  properties:
                                      lang:
                                          type: string
                                      percent:
                                          type: double

Почему поле github не создают в упругой я не понимаю (это мой весь конфиг постебин)

1 ответ

Решение

"skills": { "type": "string" },

определяется как строка в вашем отображении, но в ваших навыках данных есть массив с ключами lang и процентами, так что ваше частичное отображение навыков должно быть.

"skills": {
    "properties" : {
        "lang" : {
            "type" : "string"
        },
        "percent" : {
            "type" : "double"
        },
    }
},

Отредактировано: должно работать.

indexes:
profile:
    finder: ~
    types:
        team:
             mappings:
                 id:
                   type: integer
                 slug:
                   type: string
               projects:
                    type: "nested"
                    properties:
                         id: ~
                         title:
                            type: string
                         description:
                            type: string
                         skills:
                            properties:
                              lang:
                                type: string
                              percent:
                                type: double
             persistence:
                  driver: orm
                  model: Artel\ProfileBundle\Entity\Teams
                  provider: ~
                  listener:
                    immediate: true
                  finder: ~
Другие вопросы по тегам