6

我正在寻找一种在 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 的初学者,正在努力学习。有没有办法可以完成所需的请求,或者我是否必须为价格寻找单独的索引并使用多个查询

谢谢。

4

1 回答 1

7

当对数组应用facetFilteror时,Algolia 的引擎会检查数组的任何元素是否匹配,然后转到下一个条件。tagFilter

它以这种方式而不是您期望的方式运行的原因很简单:假设您有一个字符串数组(如标签):

{ 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重复数据删除),或者每个月或每天有一个索引。这实际上取决于您的用例,这使得为您提供正确的解决方案有点困难。

于 2016-01-09T13:30:38.427 回答