Algolia 即时搜索年龄范围滑块基于出生日期

Algolia instantsearch age rangeslider base on date of birth

我目前正在尝试使用 instantsearch.js "rangeslider" 小部件从我的索引数据中的出生日期创建一个年龄范围滑块。 检查了文档,似乎没有我可以用来将出生日期转换为数字年龄数字的转换数据函数,就像 "hits" 小部件一样 可以做。

我想到的一种方法是在索引中创建一个年龄列,然后 运行 每天执行一个 cron 作业以根据出生日期更新每个记录的年龄列,但这似乎并不像一个优雅的解决方案。

我想知道这种情况是否有任何解决方法或现有解决方案?

Laravel as backend 的解决方案(感谢 Jerska):

public function getAlgoliaRecord()
{
    /**
     * Load the categories relation so that it's available
     *  in the laravel toArray method
     */

    $this->dob_timestamp = strtotime('01-01-2100') - strtotime($this->dob);

    return $this->toArray();
}

在前端:

function _calculateAge(birthday) { // birthday is a date
        var ageDifMs = Date.now() - birthday.getTime();
        var ageDate = new Date(ageDifMs); // miliseconds from epoch
        return Math.abs(ageDate.getUTCFullYear() - 1970);
    }

 search.addWidget(
            instantsearch.widgets.rangeSlider({
                container: '#age',
                attributeName: 'dob_timestamp',

                tooltips: {
                    format: function(formattedValue) {

                        var dob = new Date((4102444800-formattedValue)*1000);
                        var age =_calculateAge(dob);
                        return age;
                    }
                }

            })
    );

CSS:

.ais-range-slider--value{ display:none; }

你的解决方案涉及 运行 每天一个 cron 确实可行,但我认为你可以用更简单的方式来做到这一点。

您可以简单地为您的日期索引数字时间戳并将它们添加到 attributesForFaceting。您可能希望索引类似 timestamp('01-01-2100') - timestamp(birthdate) 的内容,否则您的滑块将在左侧较旧,在右侧较年轻。

完成后,您可以将此属性用作 rangeSlider widget 的主要参数。
然后,您可以使用 options.tooltips 将此时间戳转换为实际可显示的年龄,使用 CSS 隐藏图例值 (.ais-range-slider--value),您就可以开始了。