当我关心的数据发生变化时,我试图通过只更新Algolia记录(从而节省数千次不必要的操作(来优化我的应用程序。
我有一个表格,里面有各种产品的价格信息,当价格变化时,每分钟都会更新。目前,Algolia的可搜索模型与预期保持同步,但这是不必要的,因为我网站上的搜索功能只提供产品本身的搜索,而不是价格。
目前,Scout每次在模型上调用update()
方法时都会在Algolia中执行一次操作(在每个模型上每分钟执行一次(。
有没有一种方法可以让我有条件地触发Algolia只在制造商、产品或型号变体发生变化而不是价格发生变化时进行更新
我的模型上的toSearchableArray()
函数目前看起来是这样的,如果这有帮助的话:
public function toSearchableArray() {
return [
'id' => $this->id,
'manufacturer' => $this->manufacturer,
'product' => $this->product,
'variant' => $this->variant,
];
}
您想要的是withoutSyncingToSearch
方法吗?
这意味着,无论你目前在哪里更新价格,都要用这种方法包装。
虽然您的问题中没有提供此代码,但我假设大致如下:
AppModel::withoutSyncingToSearch ( function() use ($item, $newPrice) {
$item->price = $newPrice;
$item->save();
});
能为你工作吗?
为您的模型添加以下函数:
public function searchIndexShouldBeUpdated()
{
if (empty(array_intersect_key( $this->getChanges(),$this->toSearchableArray() )))
{
return false;
} else {
return true;
}
}
它将检查上次更新是否更改了可搜索数组中的任何属性,并且只有在进行了此类更新时才会更新搜索索引。