问题描述
我有三个表,例如 users
、articles
和 user_article
。 users
表是不言自明的。在 articles
我有很多条目,例如20k。在 user_article
中,我输入了用户拥有的文章。
如果用户进入搜索页面,他应该有一个带有 available
和 unavailable
的选择选项。如果用户选择可用,则应显示登录用户拥有的所有文章(来自 user_article
表)。如果用户选择不可用的所有其他文章,如果没有选择任何文章,则应显示所有文章。
如何添加过滤器/构面来过滤用户可用的文章?
主要想法是用一个数组扩展 toSearchableArray(),该数组包含用户拥有文章的信息,但在文档中是这样的 information:
不允许对嵌套数组或对象进行过滤。
考虑到您可以拥有数千个用户,您如何处理此类特定于用户的过滤。
解决方法
您似乎试图找到一种解决方案来与 MeiliSearch 建立多对多关系。我们不是关系数据库,因此没有简单的解决方案:/
您必须先对文章进行转换,然后才能将其发送到 meilisearch。
例如这样的事情 (this can be done in one sql query if you want that but this example will be sub-optimal for clarity)
$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"]
}
两个键都应该添加,因为MeiliSearch不能做一个过滤器,你可以说“给我所有在“available_user”中不存在“username”的文章。因此,您必须在两个方面进行方面过滤。
因此,要做到这一点,请在设置中的 attributesForFaceting 中添加两个键 ["available_user","unavailable)user"
然后在搜索过程中你应该做
search.(“mysearch”,{ facetFilters: [“available_user: michel”])
当米歇尔想要他的所有可用文章时 和
search.(“mysearch”,{ facetFilters: [“unavailable_user: michel”])
当米歇尔想要他所有不可用的文章时。