Algolia AND搜索数组

时间:2016-01-08 17:07:43

标签: algolia

我正在寻找一种在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

感谢。

1 个答案:

答案 0 :(得分:7)

当在阵列上应用facetFiltertagFilter时,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进行重复删除),也可以每月或每天使用一个索引。这实际上取决于您的用例,这使得为您提供正确的解决方案有点困难。