【问题标题】:Searching open and close business hours with thinking sphinx in rails 3.0在 rails 3.0 中使用 think sphinx 搜索营业时间和营业时间
【发布时间】:2011-04-03 13:07:11
【问题描述】:

我有一个有趣的问题,也许有人可以解决。我有一个想要搜索的商业模型,所以我将thinking_sphinx 加入其中,现在我可以搜索了。

现在我的商业模式有_许多小时。

class Business
has_many :hours
define_index ...

class Hour
belongs_to :business

我的小时表包含以下列:business_id、day_of_week(int)、open_time(mysql time)、close_time(mysql_time)。使问题更加复杂的另一个问题是,每天可能有多个打开/关闭时间。例如:周一 8:00-12:15 和 15:00-20:00 开放

如果我想在我的网站上添加过滤器以仅在搜索中显示开放业务,有没有办法可以将我的时间索引到 sphinx 索引中并通过 :with 进行搜索?

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: ruby-on-rails ruby indexing sphinx thinking-sphinx


    【解决方案1】:

    这可能并不理想,但您应该能够使搜索正常工作 - 但是,它将通过 Hour 模型,而不是 Business。

    define_index do
      indexes business.name, :as => :business
    
      has business_id
      has day_of_week
      has 'CAST(open_hour AS INT)',  :as => :open_hour,  :type => :integer
      has 'CAST(close_hour AS INT)', :as => :close_hour, :type => :integer
    end
    

    我不确定时间的转换 - 但本质上我们只想处理整数,Sphinx 没有时间数据类型。

    搜索可能看起来像这样:

    now  = Time.zone.now
    time = (now - now.beginning_of_day).to_i
    Hour.search 'foo',
      :with => {
        :day_of_week => now.wday,
        :open_hour   => 0..time,
        :close_hour  => time..240000
      },
      :group_by       => 'business_id',
      :group_function => :attr
    

    这将为您提供按营业 ID 分组的营业时间对象 - 因此您不会获得重复的营业。

    所有的理论,但试一试,让我知道你的进展:)

    【讨论】:

    • 针对 BusinessHour 模型执行此操作,我该如何处理营业时间不是他们过滤的唯一内容的情况。例如他们正在按公司名称、类别和营业时间进行搜索?
    • 您需要有字段或属性通过关联来绘制这些数据,就像上面为企业名称所做的那样。然后,您可以使用 :with (用于属性)或 :conditions (用于字段)进行相应的过滤。
    • 我最初返回的业务结果比需要的多得多,然后检查它们是否在内存中打开/关闭。真的写的很烂而且很慢。我终于开始实施您的方法并且效果很好。并非所有企业都有营业时间,所以我有 2 个不同的索引。我使用正常的 business_index 进行正常查询,并在选择打开/关闭过滤器时使用 hours_index。谢谢帕特。
    • 另一个障碍是,在我的搜索结果中,我按距离排序,而 :group_by 和 :group_function 在我的搜索中打破了 :order 范围。我刚刚放弃了 :group 范围,因为营业时间在一个企业中永远不会重叠,因此我不必担心同一个企业会被返回两次。
    【解决方案2】:

    首先,您需要将 Hours 模型更改为“belongs_to”而不是 has_one,以便 Hours 模型知道它直接链接到所附加的业务。您可能还希望将 open_time、close_time 和 day_of_week 列编入索引,以便一起快速搜索它们。

    add_index :hours, [:day_of_week, :open_time, :close_time]
    

    为了找到开放的业务,您可以创建一个如下所示的范围。我假设您正在使用 ActiveRecord。

    class Hour < ActiveRecord::Base
      belongs_to :business
    
      scope :open, lambda { |day, time| { :conditions => ["hours.day_of_week = ? AND hours.open_time >= ? AND hours.close_time < ?", day, time, time] } }
    end
    

    通过这种方式找到您只需要做的开放业务:

    Hour.open.includes(:business)
    

    每个营业的企业都将附加到他们的营业时间模型。如果您想遍历它们并访问企业信息,您可以这样做:

    Hour.open.includes(:business).each do |hour|
      puts "#{hour.business.name} is open! It closes at #{hour.close_time}."
    end
    

    【讨论】:

    • 感谢您的回复。我编辑了我的问题以正确显示belongs_to。无论如何,我并不是真的想弄清楚一家企业是否开放,而是将狮身人面像搜索与仅显示开放企业相结合。也许我不明白你的回答,但你定义了一个索引,但没有告诉我如何使用它。
    • 我不知道 Sphinx,但我假设基于 the docs 上面生成的过滤器适用于 sphinx。我不知道它是否直接映射到 Ruby api。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2015-04-11
    • 2014-05-31
    相关资源
    最近更新 更多