美利通用户特定过滤

问题描述

我有三个表,例如 usersarticlesuser_articleusers 表是不言自明的。在 articles 我有很多条目,例如20k。在 user_article 中,我输入了用户拥有的文章

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

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

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

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

解决方法

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

您必须先对文章进行转换,然后才能将其发送到 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”]) 

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

original answer here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...