我有三个表,如users
、articles
和user_article
。users
表格不言自明。在articles
中,我有很多条目,例如20k。在user_article
中,我有用户拥有的条目。
如果用户转到搜索页面,他应该有一个带有available
和unavailable
的选择选项。如果用户选择可用,则应显示登录用户拥有的所有文章(来自user_article
表(。如果用户选择了不可用的所有其他文章,并且如果没有选择任何内容,则应显示所有文章。我如何添加过滤器/方面来过滤用户可用的文章?
主要想法是用一个数组来扩展toSearchableArray((,该数组包含用户拥有文章的信息,但在文档中是这样的信息:
不允许对嵌套数组或对象进行筛选。
考虑到可能有数千个用户,您如何处理这种特定于用户的过滤。
您似乎试图找到一个解决方案来与MeriliSearch建立多对多关系。我们不是关系数据库,因此没有简单的解决方案:/
在发送到meilisearch之前,您必须对文章进行转换。
例如这样的事情(如果你想的话,这可以在一个sql查询中完成,但为了清晰起见,这个例子是次优的(
$articles = db.execute("SELECT id, title from articles"0:
$users = db.execute(" SELECT id, username from articles"):
$user_article_bind = db.execute("SELECT article_id, user_id from user_article")
foreach ($articles as &$article) {
// using $article.id, loop over $user_article_bind to find all the user_id that have a connection with the current $article.id
// with the array of user_ids, loop over $users to transform the id list into username list
$article["available_user"][] = available_username_array
// something similar for unavailable_users
}
为了获得文章的这种结构,这些文章应该被索引到meilisearch 中
{
"id": 1,
"title": "my article",
"available_user": ["john", "marie"],
"unavailable_user": ["Sophia", "michel"]
}
这两个键都应该添加,因为MeriSearch不能做一个过滤器,你可以说"给我所有在"available_user"中没有"username"的文章。"。因此,您将不得不在两个方面进行分面过滤。
因此,要做到这一点,请在设置中的attributesForFaceting中添加两个键["available _user","unavailable(user">
然后在搜索过程中,你应该进行
search.(“mysearch”, { facetFilters: [“available_user: michel”])
当米歇尔想要所有可用的物品时和
search.(“mysearch”, { facetFilters: [“unavailable_user: michel”])
当米歇尔想要所有无法获得的文章给他时。
此处为原始答案