elasticsearch 实现用户最近查看

mfuanj7w  于 2022-12-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(148)

我正在使用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天的点击与否。
如何为这种情况创建索引或如何解决此问题?

w9apscun

w9apscun1#

也许一个解决方案,使用较少的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

相关问题