首页 > 解决方案 > Meilisearch 用户特定过滤

问题描述

我有三个表users,例如articlesuser_article。该users表是不言自明的。在articles我有很多条目,例如20k。在user_article我有用户拥有的文章的条目。

如果用户进入搜索页面,他应该有一个带有available和的选择选项unavailableuser_article如果用户选择可用,则应显示登录用户拥有的所有文章(来自表格)。如果用户选择不可用所有其他文章,并且如果没有选择任何文章,则应显示所有文章。如何添加过滤器/构面来过滤可供用户使用的文章?

主要思想是用一个数组扩展 toSearchableArray() ,该数组包含用户拥有该文章的信息,但在文档中是这些信息

不允许过滤嵌套数组或对象。

考虑到您可以拥有数千个用户,您如何处理此类特定于用户的过滤。

标签: phplaravellaravel-scoutmeilisearch

解决方案


似乎您试图找到一个解决方案来与 Meil​​iSearch 建立多对多关系。我们不是关系数据库,因此没有简单的解决方案:/

您必须先转换文章,然后再发送到 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"]
}

应该添加这两个键,因为 Meil​​iSearch 无法进行过滤,您可以说“给我所有在“可用用户”中不存在“用户名”的文章。所以你必须在两个方面都进行分面过滤。

因此,为此,请在设置的attributesForFaceting中添加两个键 ["available_user", "unavailable)user"

然后在搜索过程中你应该做

search.(“mysearch”, { facetFilters: [“available_user: michel”]) 

当 Michel 想要为他提供所有可用的文章时,

search.(“mysearch”, { facetFilters: [“unavailable_user: michel”]) 

当米歇尔想要他所有不可用的文章时。

原始答案在这里


推荐阅读