【问题标题】:How to integrate search results with database如何将搜索结果与数据库集成
【发布时间】:2020-05-10 17:48:45
【问题描述】:

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

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

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

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

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

  2. 在文档本身中保留一个喜欢故事的用户列表,并在搜索时检查用户是否在列表中。这会炸毁搜索索引的大小吗?

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

【问题讨论】:

  • 我会选择选项 3,但您需要对其进行基准测试。

标签: api rest elasticsearch search datastore


【解决方案1】:

对于这个用例,最常见/主流的方法是您的选择 3。

  • 您需要将每个点赞都保存为数据存储区中的记录。
  • 您需要为 Elasticsearch(ES) 中的文档编制索引,其中很可能只包含您将用于搜索和聚合目的的属性,而不是整个文档。
  • 在前端使用查询/搜索后,您从 ES 中查找文档并获取其 ID。
  • 转到数据存储区类似记录并检查每个记录是否有用户类似记录。
  • 组合此信息并将整个文档返回到前端。

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

我唯一担心的是,对于我需要检查喜欢集合的每个查询,此请求对 CDN/缓存不友好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    相关资源
    最近更新 更多