abr*_*abr 7 laravel-scout laravel-8
我一直在使用 laravel scout 进行一些测试,并根据文档(https://laravel.com/docs/8.x/scout#configuring-searchable-data),我已将我的用户模型映射为这样:
/**
* Get the indexable data array for the model.
*
* @return array
*/
public function toSearchableArray()
{
$data = $this->toArray();
return array_merge($data, [
'entity' => 'An entity'
]);
}
Run Code Online (Sandbox Code Playgroud)
只是为了测试,这就是我在调试时得出的结论。
使用此映射导入用户模型后,我可以在 meilisearch 仪表板上看到它确实显示了用户数据 + 实体 = '一个实体'。
但是,应用此方法时:
User::search('something')->where('entity', 'An entity')->get()
它会产生以下错误:
"message": " --> 1:1\n |\n1 | entity=\"An entity\"\n | ^----^\n |\n = attribute `entity` is not filterable, available filterable attributes are: ",
"exception": "MeiliSearch\\Exceptions\\ApiException",
"file": "/var/www/api/vendor/meilisearch/meilisearch-php/src/Http/Client.php",
Run Code Online (Sandbox Code Playgroud)
回溯查看“可过滤属性”,我得出的结论是:
$client = app(\MeiliSearch\Client::class);
dump($client->index('users')->getFilterableAttributes()); // Returns []
$client->index('users')->updateFilterableAttributes(['entity']);
dump($client->index('users')->getFilterableAttributes()); // Returns ['entity']
Run Code Online (Sandbox Code Playgroud)
现在强制 updateFilterableAttributes 允许我按预期完成搜索,但我不认为这应该是常规行为?如果它映射到 searchableArray 上,它应该是可搜索的?我不明白什么以及还有哪些其他方法可以实现此目标?
这其实不是问题,而是meilisearch的特殊要求。Scout 在底层使用不同的驱动程序进行索引 - “algolia”、“meilisearch”、“database”、“collection”甚至“null”,它们都有不同的索引方法,我相信这些方法的统一对于 scout 来说会很麻烦且效率低下。
因此,过滤或 meilisearch 所指的分面搜索需要我们首先建立过滤条件,文档(laravel 中的模型)字段默认为空。
引用文档:
此步骤是强制性的,不能在搜索时完成。过滤器需要经过美丽搜索的适当处理和准备后才能使用。
更新filterableAttributes需要重新创建整个索引。这可能需要大量时间,具体取决于您的数据集大小。
更多信息请参考meilisearch官方文档https://docs.meilisearch.com/learn/advanced/filtering_and_faceted_search.html
| 归档时间: |
|
| 查看次数: |
3135 次 |
| 最近记录: |