elasticsearch 实现用户最近查看

qltillow  于 2022-12-29  发布在  ElasticSearch
关注(0)|答案(2)|浏览(116)
    • bounty将在19小时后过期**。回答此问题可获得+50声望奖励。Remember_me希望引起更多人关注此问题。

我正在使用elasticsearch和gem searchkick在我的应用程序。我有一个事件模型,在那里用户可以点击事件等。
在事件列表中,我有一个过滤器的要求"在过去7天内查看"。我想知道什么是最好的方法来索引数据,使其适当地服务于要求。
一开始我考虑在Event模型ES索引中存储用户ID,如下所示:

Event: {
 _id: 1,
 user_ids: [1,2,3,4...]
}

但是这会给我所有的事件视图,而不仅仅是最近7天的。我该如何创建索引数据来适应这种情况呢?

    • 根据评论进行更新,以提供更多背景信息:**

以下是一些事件的示例(存储的内容):

[
  {
    _id: 1,
    name: 'Company get together',
    start_time: '10:00',
    start_date: '2022-10-01',
    duration: 3600
    ...
  },
  {
    _id: 2,
    name: 'Company break',
    start_time: '00:05',
    start_date: '2022-01-01',
    duration: 172800
    ...
  },
  {
    _id: 3,
    name: 'Sales webinar',
    start_time: '09:00',
    start_date: '2022-15-01',
    duration: 7200
    ...
  },
  ...
]

这是一个关于当前事件的例子,如果某个用户点击了这个事件,我们希望在事件模型中记录这个事件,这样我们就可以返回用户在过去7天内点击的事件列表。
如果我们使用这样的结构:

{
    _id: 3,
    name: 'Sales webinar',
    start_time: '09:00',
    start_date: '2022-15-01',
    duration: 7200,
    user_click_ids: [1, 2, 3]
    ...
  }

每次用户单击特定事件时,我们都会将其附加到user_click_ids,然后我可以使用user_click_ids返回单击该事件的用户列表(并过滤它以提供当前用户ID)。
但我需要另一个维度,不仅是哪个用户点击了,而且是在过去7天的点击与否。
如何为这种情况创建索引或如何解决此问题?

5kgi1eie

5kgi1eie1#

也许一个解决方案,使用较少的searchkick,但你可以使用另一个模型来处理这个问题?在我的头上(还没有运行这个):

class CreateEventClicks < ActiveRecord::Migration
  def change
    create_table :event_clicks do |t|
      t.belongs_to :event, null: false, foreign_key: true
      t.belongs_to :user, null: false, foreign_key: true
      t.timestamps
    end

    add_index :event_clicks, :event, :user
  end
end
class EventClicks < ApplicationRecord
  belongs_to :user
  belongs_to :event
end
def find_clicked_events(user, event, time)
  EventClicks.where(user_id: user.id, event_id: event.id, created_at: time..Time.now)
end
4sup72z8

4sup72z82#

我不确定searchkick,因为我是.net的人,但是我会存储关于点击的全部信息,而不仅仅是id。

Event: {
 _id: 1,
 user_clicks: [{
   user_id: 1,
   timestamp: 2022-02-24 4:00:00
 }, ...]
}

然而,根据预期的使用模式(即大量用户点击大量事件),文档可能会变得很大,如果是这种情况,你可以考虑在后端做额外的过滤,而不是elasticsearch。
在这种情况下,您可以使用类似user_activities index的值

user_id: 1,
event_clicks: [{
  event_id: 1
  timestapmp: 2022-02-24 04:00:00
}, ...]

这种方法的明显缺点是后端上的额外代码可能难以支持并使事情复杂化。
NoSQL数据库(以及elasticsearch)的问题在于,没有一个万能的解决方案,你必须使用understand your query patterns well。因此,你需要自己决定是什么阻碍了你:使用方法1增加文档大小或使用方法2在后端添加一些自定义逻辑。

相关问题