如何在Algolia中搜索持续时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Algolia中搜索持续时间相关的知识,希望对你有一定的参考价值。

假设我正在建立一个酒店预订平台,每个房间记录都有可用性日历。常见的搜索条件是按持续时间搜索。用户输入开始日期和结束日期的位置,数据库提取未从该持续时间占用的房间。

我已经实现了一种非常天真的方法,我将占用的天数存储为一系列天。

attribute :occupied_at_i do
    array = []
    if !occupied_at.empty?
        occupied_at.each do |date|
            array << Time.parse(date).to_i
        end
    end
    array
end

然后在客户端,我添加以下javascript代码,以交叉检查这一天是否在numericRefinement

// Date Filters
$('.date-field')
    .on('change', function() {
        if(_.every(_.map($('.date-field'), function(date) {return _.isEmpty(date.value) }), function(n) {return n==false;})) {
            helper.clearRefinements('occupied_at_i');
            var arrayOfDates = addDateFilters();
            _.forEach(arrayOfDates, function(n) {
                helper.addNumericRefinement('occupied_at_i', '!=', n);
            });
            showClearAllFilters();
            helper.search();
        }
    });

所以,它显然不是一个好方法,我想知道什么是更好的利用algolia和搜索持续时间?

谢谢

答案

希望这有助于其他人(因为问题已经提出了很久)

最好在服务器端进行过滤并渲染结果。这里有一种方法是将datetime字段添加到Room模型中,如start_dateend_date。因此,当用户输入开始日期和结束日期时,将根据该持续时间中的占用状态获取记录。一个简单的查询就像:

Room.where.not("start_date >= ? AND end_date <= ?", start_date, end_date)

另一个最佳解决方案是使用另一个模型来保存带有开始和结束日期时间字段的房间预订详细信息。这样我们就可以为特定房间预订多个房间,并且可以同时保存在房间预订系列中。因此查询将变为:

Room.left_joins(:room_bookings).
  where(
    "room_bookings.start_date > ? OR
     room_bookings.end_date < ?", end_date, start_date
  )

以上是关于如何在Algolia中搜索持续时间的主要内容,如果未能解决你的问题,请参考以下文章

Algolia:在 Laravel 中搜索多个索引

渲染搜索结果后,Algolia 在 Instantsearch 中显示所有搜索参数

在 Algolia 索引中搜索准确的术语

algolia 即时搜索显示几个项目并使用分页

VuePress - Algolia 增加结果

如何连接 Algolia 和 @material-ui