如何将搜索结果与数据库集成

How to integrate search results with database

假设我将故事文档存储在 Elasticsearch 中,例如

{
  story_id: 1,
  title: "Hello World",
  content: "Foo. Bar."
  likes: 2222
}

当客户端(前端)搜索时,他们应该可以选择喜欢(或删除他们喜欢的)任何搜索结果,但也应该有他们是否喜欢每个结果的指示。

将此信息提供给客户的好方法是什么?

  1. 执行数据库查询以获取用户喜欢的所有故事并将其保存在客户端的本地存储中。当检索到搜索结果时,将用户喜欢的故事映射到客户端上检索到的搜索结果。这会增加更新本地存储的复杂性以及 API 当用户喜欢一个故事时。此外,用户喜欢的故事数量可能会变得非常多。

  2. 在文档本身中保留喜欢故事的用户列表,并在搜索时检查用户是否在列表中。这可能会增加搜索索引的大小?

    { ...  
      likes: [ 'foo_user', 'bar_user', ... ] 
    }
    
  3. 在API中,搜索后执行数据库查询,判断搜索响应中哪些故事用户已经点赞,并将此信息映射到搜索结果再返回API 响应。这可能会减慢搜索速度,因为需要额外的数据库查询,但这可能无关紧要?

对于此用例,大多数 common/mainstream 方法是您的选项 3。

  • 您需要将每一个赞保存为数据存储中的一条记录。
  • 您需要在 Elasticsearch(ES) 中索引文档,很可能只使用您将用于搜索和聚合目的的属性,而不是整个文档。
  • 从前端使用 query/search 后,您从 ES 查找文档并获取它们的 ID。
  • 转到类似记录的数据存储区,检查是否有每个记录的用户类似记录。
  • 将此信息与 return 整个文档合并到前端。

我想说,额外的数据存储查找不会花费您太多时间和金钱。对用户体验影响不大。

我唯一担心的是,对于我需要检查点赞集合的每个查询,此请求都不 CDN/cache 友好。