我正在通过instantsearch.js使用范围滑块实现搜索过滤器。
滑块根据每个项目的year
数据列过滤一系列年份。在这个数据库中,有一些项目没有精确的年份,但有一个“假设”的时期,如“大约十八世纪”或“十九世纪末”。这意味着对于这些项目,没有一年可以过滤,而是多年。
我们先说吧。我想在1874年到1930年的几年内过滤结果,我在year
字段中有一个“19世纪下半叶”的项目。正如你所知,它应该会导致比赛,因为从1851年到1900年的任何一年都是正确的。
如何将此类数据视为此过滤器范围的一部分?
我应该如何构建此数据库的year
列中的数据?
我应该在algolia javascript搜索中使用一些脚本逻辑,而不是使用构造数据或索引的特殊方法吗?
我在考虑一个逻辑:
“如果item的值不仅仅是数字,请将其转换为年份范围。 然后检查这些年份的范围是否与所需的过滤器匹配 滑块“
我真的不知道该怎么做,对我来说看起来有点麻烦和愚蠢。我很确定这不是DB数据设计中的新问题,所以必须有一个正确的方法来解决它。
我试着四处寻找,但我甚至都不知道如何正确地说出这个问题。如果你有编辑标题的建议,请告诉我!
我正在使用MySQL数据库和PHP。
答案 0 :(得分:1)
使用Algolia,您需要将此值转换为时间戳,然后您就可以使用numericFilter并将范围滑块或数字细化列表组件添加到您的UI。
此外,必须在索引配置中将属性定义为attributesForFaceting。
https://community.algolia.com/instantsearch.js/documentation/#rangeslider
https://community.algolia.com/instantsearch.js/documentation/#numericrefinementlist
答案 1 :(得分:1)
将year
视为范围,您可以为这些字段添加beggining
和end
属性。例如:
EventTimes
id SMALLINT NOT NULL PRIMARY,
yearEnd DATETIME,
yearStart DATETIME
在这种情况下,当事件是特定时间时,结束和开始将相等(我使用空结束),并且当两个字段被填充时变为范围。
SELECT
时,您可以随时检查这两个字段,而不会显着降低速度或准确度。然后检查特定时间,时间范围,或者如果事件开始,结束,重新开始,重新结束等等,您可以检查同一个表中的不同字段。