0

我在 FOSElasticaBundle 的 symfony2 中使用 elasticsearch,想知道在搜索后检索对象的标准做法是什么。

假设我已经映射了我的学说对象的所有字段,因此它们都存储在 elasticsearch 中,更重要的是返回。现在,在我搜索并拥有一个Elastica\ResultSet. FOSElasticaBundle 中的默认查找器将忽略 中的数据ResultSet并查询 sql db 以获取 Doctrine 对象(然后将其传递给要绘制的模板)。

  1. 我想知道这是否经常完成(对不同数据存储的两个查询),因为这似乎有点浪费。或者人们是否从ResultSet.

  2. 如果您确实手动创建对象,则弹性搜索的数据可能已过时。现在这不是查看问题,不会从过时的数据创建教义对象可能会导致这些旧数据被持久化(如果代码的某些部分刷新;我们在 symfony 1.4 和教义 1.2 中遇到了这个问题)。

谢谢!


更新

再读一点,我有2个想法(除了简单但浪费的额外sql查询方法):

  1. 创建一个自定义 ElasticaToModelTransformer,并将实体与学说实体管理器分离,确保它们不会意外持久化。从教义文档中阅读更多内容,似乎我实际上可能不需要这样做。未序列化的对象是否附加到实体管理器?

  2. 创建一个表示对象的规范化 php 数组,并将所有模板从该数组中取出,而不是从教义对象中取出。正如在 symfony 序列化程序组件文档中所讨论的,这是作为实体实例的对象与序列化为某种格式(JSON、xml)的对象之间的状态,因此该数组可以由弹性搜索结果或学说对象和模板不需要关心。

    这种方法确实意味着如果需要,您不能调用方法从模板中检索相关对象,您仅限于数组中的信息。

4

2 回答 2

0

如果有人在寻找答案,这里可能有用: FOSElasticaBundle 和 Doctrine Hydration

于 2015-02-04T09:00:58.283 回答
0

实际上,您在问题上是正确的。

使用 ORM 时,如果您从 ElasticSearch 创建过时的对象,然后将它们持久化,Doctrine 会将您的旧值保存到主数据存储中。这很糟糕。

以下是赞成和反对的两种解决方案:

  1. 要求 ES 只返回文档 ID(通过“字段”),然后从 Doctrine 中获取它们是处理它的好方法:开销很低,而且你有好处或真正的 Doctrine 对象(可以编辑,已经迄今为止,与其他人共享相同的模板...)。这就是 ElasticaBundle 所做的。您只需索引搜索所需的字段(较小的索引)。

  2. 直接使用 ES 文档比较棘手:您不必映射所有字段(您可以获取 Source,这是您的索引文档未触及)但您必须调整您的视图,您将无法调用自定义 getter,等等在全球范围内,您将无法在 Document 上执行任何业务逻辑。此外,您必须索引您想要显示的每个字段,而不仅仅是您搜索的字段(更大的索引)。

于 2013-08-22T15:59:22.503 回答