【问题标题】:Some properties of an Entity need full-text search, others don't实体的某些属性需要全文搜索,而另一些则不需要
【发布时间】:2014-06-14 09:07:52
【问题描述】:

在我的应用程序中,我有一个名为 Product 的实体,其中包含 要在网站上显示的产品列表。由于名称(标题)和 产品描述需要全文搜索,我将它们放入 一个单独的 Document(由 Google 的 App Engine Search API 定义)。所有其他 属性保留在Product 实体中,该实体通常存储在 Google Datastore 使用 Objectify

Productname 属性创建的 slug 是 Document。同样的 slug 是一个实体的 (String) ID(我们称之为 ProductLookup),我将使用它来获取 Key 到对应/匹配 Product.

注意:Product 有一个自动生成的Long id 作为name 属性 (因此用于查找 Product 的 slug 甚至在 创建Product——这样我就创建了一个新的ProductLookup name 更改时的实体。

因为我要拆分通常在单个实体中的信息 分成两个不同的对象(ProductDocument,更不用说 额外的ProductLookup实体),有什么我应该注意的特殊情况 出去干嘛?有什么建议吗?


如果我有对 Product 的引用,我可以使用 slug 来获取对应的 Document.

如果我有 slug,我可以使用 ProductLookup 获取 Product 并使用 slug 作为Documentdoc_id

如果我通过 Search API 找到一组Documents,我可以使用他们的doc_ids 来获取 ProductLookup,然后是 Product

【问题讨论】:

  • 我已经更新了设计以在数据存储实体中包含所有数据,并在搜索 API 中使用全文可搜索字段创建文档。这会导致一些重复,但麻烦会少很多。

标签: java google-app-engine full-text-search objectify


【解决方案1】:

我目前的项目也有类似的情况。最初我使用的是像您这样的技术,我所知道的唯一警告是您必须格外小心,以确保从两个来源添加和删除产品总是同时成功或失败。数据存储操作可以放在一个事务中,但 Search API 操作不会遵守该事务的规则。例如,如果您在一个事务中同时从数据存储区和搜索 API 中删除,并且该事务失败,则该产品不会从数据存储区中删除,但仍可能从搜索 API 中删除。为确保它们保持同步,请使用this 之类的技术,并确保您的搜索 api 操作在您的事务中是最后的。

我已经修改了将整个对象保存在数据存储中的方法,并将可搜索字段的副本存储在搜索 api 中。这种方法的缺点是您需要为额外的存储付费。好处是,当您不进行搜索时,检索成本会更低。当 Objectify 在内存缓存中找到您的对象时尤其如此。

为了支持我的方法,我编写了自己的“mini-objectify”,将对象持久保存到搜索 API。它有自己的@Igore 版本,因此我可以对两者使用相同的 POJO,并且只将我选择的字段保留到搜索 api。

【讨论】:

  • 自从问了这个问题(并且没有得到任何回应 :-) 我也转向了与您类似的设计——在搜索 API 中复制一些数据(请参阅我对原始问题的评论)我还没有计划实现一个小目标化(还 ;-)。
  • @markvgti 哈!我应该读过评论。它会为我节省一些打字时间。 :)
  • @markvgti 但是,很好地使用事务以使两者保持同步仍然很重要。也就是说,我的第一段仍然适用。
  • 完全不是你的错:我在阅读了你的评论后添加了评论,因为我意识到其他人可能会出现并且无法知道我已经改变了我的设计:-)。跨度>
  • 是的,你是对的。我还没有实现 Search API,但这是我的想法:如果实体已创建但尚未编入索引(任务可以搜索此类实体并修复情况),这还不错。如果实体已被删除但相应的搜索 API 索引未能清理,这也不是很糟糕:再次可以通过定期任务来处理它。是的,用户会在他们的结果中得到无效的条目,但这不是灾难性的。
猜你喜欢
  • 2023-03-29
  • 2015-01-09
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多