如何实现用户关系定制的全文搜索

How to implement a full text search customized by user relations

我目前正在开发一个 laravel 应用程序,用户可以在其中添加文章等内容,并且可以通过搜索引擎搜索这些文章。我想实施现代全文搜索解决方案。 但事实是,用户可以将文章设为私人文章,使其仅供其关注者或朋友阅读。

在简单的 SQL 中使用一个简单的 where 子句在主元 table 关系上实现会很简单,但这在大型数据库上几乎没有性能。

我对弹性搜索和其他搜索引擎进行了研究和开发,但限制是所有数据集都是可搜索的,我无法根据用户定义的关系自定义过滤器。 我应该为每个用户创建一个索引而不是全局索引吗?这似乎也有很大的影响

非常感谢您对此的任何想法,在此先感谢。

你可以在 Elasticsearch 中使用我能想到的几种方法

  1. 最好将 document level security as it's the most secure approach, but don't use filtered aliases 与此一起使用
  2. 添加一个布尔值 private 字段,然后您可以根据该字段进行过滤。这远不如上面的 DLS 安全

如果您尝试过第二种方法,那么分享您所做的和无效的会有所帮助

换个角度看问题。

与其考虑某篇文章是否可以被某些用户组访问,不如考虑用户和哪些文章 she/he 可以访问。

搜索始终由特定用户执行,因此可以知道 she/he 关注了谁 (followed_user_ids) 并且与 (friend_ids) 成为好友。此信息可在查询构建时使用。

示例查询可能如下所示:

{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "private": false
          }
        },
        {
          "bool": {
            "filter": [
              {
                "term": {
                  "private": true
                }
              }
            ],
            "should": [
              {
                "terms": {
                  "author_id": followed_user_ids,
                }
              },
              {
                "terms": {
                  "author_id": friend_ids,
                }
              }
            ],
            "minimum_should_match": 1
          }
        }
      ]
    }
  }
}

它会找到以下文章:

  • 不是私有的(对所有人可见);或
  • 是私人的,但由朋友或当前用户关注的用户创作