php - Meilisearch 用户特定过滤
问题描述
我有三个表users
,例如articles
和user_article
。该users
表是不言自明的。在articles
我有很多条目,例如20k。在user_article
我有用户拥有的文章的条目。
如果用户进入搜索页面,他应该有一个带有available
和的选择选项unavailable
。user_article
如果用户选择可用,则应显示登录用户拥有的所有文章(来自表格)。如果用户选择不可用所有其他文章,并且如果没有选择任何文章,则应显示所有文章。如何添加过滤器/构面来过滤可供用户使用的文章?
主要思想是用一个数组扩展 toSearchableArray() ,该数组包含用户拥有该文章的信息,但在文档中是这些信息:
不允许过滤嵌套数组或对象。
考虑到您可以拥有数千个用户,您如何处理此类特定于用户的过滤。
解决方案
似乎您试图找到一个解决方案来与 MeiliSearch 建立多对多关系。我们不是关系数据库,因此没有简单的解决方案:/
您必须先转换文章,然后再发送到 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"]
}
应该添加这两个键,因为 MeiliSearch 无法进行过滤,您可以说“给我所有在“可用用户”中不存在“用户名”的文章。所以你必须在两个方面都进行分面过滤。
因此,为此,请在设置的attributesForFaceting中添加两个键 ["available_user", "unavailable)user"
然后在搜索过程中你应该做
search.(“mysearch”, { facetFilters: [“available_user: michel”])
当 Michel 想要为他提供所有可用的文章时,
search.(“mysearch”, { facetFilters: [“unavailable_user: michel”])
当米歇尔想要他所有不可用的文章时。
推荐阅读
- c++ - 为什么在这个链表的实现中,这个 C++ 构造函数在同一个内存位置被调用了两次?
- python - 如何在连接四游戏中确定获胜者
- c# - DevExpress - 在 TreeList 中选择多个复选框
- c++ - 我应该如何使用 c++ 处理“std::cerr”和“std::cin.fail()”?
- c# - 有没有办法通过 MVVM 和 XAML 来拉伸 DataGrid 中的行以垂直占用所有空间?
- android - Listview 自定义过滤器在过滤列表中单击错误的项目
- c# - C# 使用 for() 处理多个变量
- python - 如何使 QTableWidget 的最后一列的大小等于其他列的大小
- allennlp - 据我所知,没有办法在 AllenNLP 配置文件中参数化字符串——只有整数或浮点数
- r - geom_bar() + facet_wrap() 中的列宽不一致