2016-01-08 67 views
6

我正在寻找一种方法来在Algolia中搜索一个记录,其中至少有一个数组元素符合几个条件。 作为一个例子,假设这样的记录:Algolia AND通过数组搜索

{ 
    "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

(A产品在价格低于60给定日期)

因为价格条件不满足该日期,但无论如何返回录制查询应该不返回任何东西。可能是因为在所有价格中“全球”都满足了条件。

我与Algolia一个初学者,努力学习。有没有一种方法可以完成预期的要求,还是需要单独索引价格并使用multiple queries

谢谢。

回答

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删除重复的),或者每月或每天一个指数。这取决于你的使用情况,这使得给你正确的解决方案有点难。