Выравнивание вложенных полей FOS ElasticaBundle

У меня есть FOSElasticaBundle в моем проекте Symfony. У меня есть объект, сопоставленный с ElasticaBundle, который имеет несколько «простых полей», например

mappings:
 createdAt:
    type: "date"

и другие поля, которые являются идентификаторами (например, owner_id) для сопоставления с другими объектами, такими как

owner:                   
     type: "nested"
     properties:
          fullname:
          type: string
          index: not_analyzed

потому что мне нужно, чтобы полное имя пользователя было доступно для поиска с помощью ES/Kibana. Это работает, но, конечно, создало вложенное поле «owner.fullname», и такие поля недоступны для поиска с помощью Kibana (с тех пор, как об этом поступают запросы).
Итак, я спрашиваю: есть ли способ сгладить это поле, чтобы у меня было простое строковое поле в ES с именем «owner_fullname» без вложенных данных?
Спасибо.


person Lo Zio    schedule 10.07.2016    source источник


Ответы (1)


Ответьте себе.
Вы можете создать метод (или использовать существующий, где это возможно) в своем классе для возврата информации о связанном классе.
Итак, если у вас есть класс User, связанный с несколькими классами Address, для хранения адресов пользователей и вы хотите сохранить в ES значение по умолчанию, вы можете создать метод «getDefaultAddress» в классе User, что-то вроде

public function getDefaultAddress() {
    return $this->addresses->getDefault()->getFormattedFlatString()
}

затем сопоставьте его с полем с помощью elastica Bundle и используйте дескриптор «property_path:», чтобы указать elastica, где взять содержимое для этого поля.
Таким образом, у вас есть простое поле в ES и не вложенный.
Я не уверен, что мне нравится эта философия, потому что вы смешиваете код и внешние слои сохраняемости, но она работает, понятна и проста в обслуживании, особенно если вы создаете в своем классе специальные методы с одинаковым префиксом, например esGetAddress, esGetPlace и т. д.

person Lo Zio    schedule 18.07.2016