【问题标题】:Getting model layer objects from elasticsearch resultset; is it normal to query the sql database again?从 elasticsearch 结果集中获取模型层对象;再次查询sql数据库正常吗?
【发布时间】:2013-08-22 12:54:48
【问题描述】:

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

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

  1. 我想知道这是否经常进行(对不同数据存储的两次查询),因为这似乎有点浪费。还是人们从 ResultSet 手动创建 Doctrine 对象。

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

谢谢!


更新

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

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

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

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

【问题讨论】:

    标签: symfony doctrine-orm elasticsearch


    【解决方案1】:

    实际上你的问题是正确的。

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

    以下是优缺点的两种解决方案:

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

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

    【讨论】:

    • 我想我希望从 elasticsearch 文档创建一个对象(我认为处于代理状态)而不去 sql db。大多数情况下,该对象将包含足够的数据供模板绘制而无需进一步查询。我更担心对象被持久化。我想我的问题是:无论如何要创建学说对象并确保它们永远不会被持久化到 sql db?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多