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