【发布时间】:2013-08-22 12:54:48
【问题描述】:
我在 FOSElasticaBundle 的 symfony2 中使用 elasticsearch,想知道搜索后检索对象的标准做法是什么。
假设我已经映射了我的学说对象的所有字段,因此它们都存储在 elasticsearch 中,更重要的是返回。现在,在我搜索并拥有Elastica\ResultSet 之后。 FOSElasticaBundle 中的默认查找器将忽略ResultSet 中的数据并查询sql db 以获取Doctrine 对象(然后将其传递给要绘制的模板)。
-
我想知道这是否经常进行(对不同数据存储的两次查询),因为这似乎有点浪费。还是人们从
ResultSet手动创建 Doctrine 对象。 -
如果您确实手动创建对象,则弹性搜索的数据可能已过时。现在这不是查看问题,但是不会从过时的数据创建教义对象,这可能会导致这些旧数据被持久化(如果代码的某些部分刷新;我们在 symfony 1.4 中遇到了这个问题和学说 1.2)。
谢谢!
更新
看了一点,我有2个想法(除了简单但浪费的额外sql查询方法):
-
创建一个自定义 ElasticaToModelTransformer,并将实体从理论实体管理器中分离,确保它们不会意外持久化。阅读更多from the doctrine docs 似乎我实际上可能不需要这样做。未序列化的对象是否附加到实体管理器?
-
创建一个表示对象的规范化 php 数组,并将所有模板从这个数组中取出,而不是从教义对象中取出。正如所讨论的on the symfony serializer component docs,这是作为实体实例的对象与序列化为某种格式(JSON、xml)的对象之间的状态,因此该数组可以由弹性搜索结果或学说对象创建,并且模板不需要关心。
这种方法确实意味着如果需要,您不能调用方法从模板中检索相关对象,您仅限于数组中的信息。
【问题讨论】:
标签: symfony doctrine-orm elasticsearch