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

时间:2016-06-10 02:29:20

标签: algolia

我目前正在尝试使用instantsearch.js" rangelider"从我的索引数据中的出生日期创建年龄范围滑块的小部件。 检查了文档,似乎没有变换数据功能,我可以用来将出生日期转换为数字年龄数字,例如"命中"小部件 能做到。

我想到的一种方法是在索引中创建一个年龄列并每天运行一个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; }

1 个答案:

答案 0 :(得分:4)

您每天运行cron的解决方案确实有效,但我认为您可以通过更轻松的方式实现这一目标。

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

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