我正在寻找一种在Algolia中搜索记录的方法,其中至少有一个数组元素符合几个条件。 举个例子,想象一下这种记录:
{
"name": "Shoes",
"price": 100,
"prices": [
{
"start": 20160101,
"end": 20160131,
"price": 50,
},
{
"start": 20160201,
"end": 20160229,
"price": 80,
}
]
}
我正在寻找一种方法来执行以下查询:
prices.price<60 AND prices.start<=20160210 AND prices.end>=20160210
(给定日期价格低于60的产品)
该查询不应返回任何内容,因为该日期未满足价格条件,但无论如何都会返回记录。可能是因为条件在所有价格中都是“全球”的。
我是Algolia的初学者并且正在努力学习。有没有办法可以达到预期的要求,还是我需要单独索取价格并使用multiple queries?
感谢。
答案 0 :(得分:7)
当在阵列上应用facetFilter
或tagFilter
时,Algolia的引擎会检查数组中的任何元素是否匹配,然后进入下一个条件。
它的行为方式而不是你期望的方式很简单:让我们假设你有一个字符串数组(比如标签):
{ tags: ['public', 'cheap', 'funny', 'useless'] }
当用户想要找到“无用”和“有趣”的记录时,该用户不会同时查找既“无用”又“有趣”的标记,但是对于包含两者的记录数组中的标签。
解决方法是以某种方式对对象进行非规范化:将包含对象数组的记录转换为多个记录,每个记录包含一个对象。
所以你会改变
{
"name": "Shoes",
"price": 100,
"prices": [
{ "start": 20160101, "end": 20160131, "price": 50 },
{ "start": 20160201, "end": 20160229, "price": 80 }
]
}
到
[
{
"name": "Shoes",
"default_price": 100,
"price": { "start": 20160101, "end": 20160131, "price": 50 }
},
{
"name": "Shoes",
"default_price": 100,
"price": { "start": 20160201, "end": 20160229, "price": 80 }
}
]
您可以在同一索引中执行此操作(并使用distinct
进行重复删除),也可以每月或每天使用一个索引。这实际上取决于您的用例,这使得为您提供正确的解决方案有点困难。