我需要构建一个系统,当任何新帖子与用户定义的规则匹配时触发通知。
例如,系统中有用户列表(比如说数百万)。并且有大量的帖子被添加(数量也很大)。
一些用户希望在任何新帖子符合他定义的规则时得到通知。
该规则是一些布尔表达式,它描述了帖子中应该(或不应该)包含哪些词。
例如,用户 A 定义如下规则:
“如果任何新帖子包含“编程”或“编码”字样,我希望收到通知,但不应包含“javascript”字样。
伪逻辑表达式:
notify = (post.contains("programming") OR post.contains("coding")) AND NOT (post.contains("javascript"))
应将此类帖子通知具有上述规则的用户:
“使用 python 编程最佳实践”
另一方面,具有上述规则的用户不应该收到这样的通知:
“使用 javascript 和 nodejs 编程后端”*
所以它类似于“反向(布尔)搜索”(不知道如何命名)。
我的意思是,在“直接”布尔搜索中,用户将键入“programming python”,所有匹配编程和python的帖子都将被返回。
但我需要相反:提供帖子,我需要返回与此帖子匹配的用户。
我正在考虑的一个“转储”解决方案是为此使用 ElasticSearch。在 ElasticSearch 中,我会存储用户定义的规则:
用户 A -> 规则 - (带有布尔规则的关键字),用户 B -> 规则 ...)
创建新帖子时,使用规则将在 ES 中通过该帖子的内容进行搜索(它只是在规则中搜索帖子单词的出现,而不应用任何布尔规则)。
因此,我将过滤(减少)可能的用户。假设这一步找到了 10000 个用户。
这篇新文章也将存储在 ElasticSearch 中(在另一个索引中)。
现在第二步,针对该单个帖子向 ElasticSearch (msearch) 索引 (posts index) 发出 BULK 搜索请求。
批量搜索请求将包含 10000 个查询(10000 个找到的用户),每个查询将包含单个用户的布尔规则(查询->布尔->必须...等)。
因此,只有匹配规则的用户才会收到通知。
您如何看待这个解决方案?据我所知,弹性搜索仅在搜索有限数量的第一个文档时速度很快,但我需要搜索数千个(对于第一步)。
也许 apache spark 更适合这个问题?(不熟悉,只知道它可以处理海量数据,想知道这个用例是否适合spark)。
您能否提供一些简短的建议或一些建议,我应该朝哪个方向去解决这个问题?
谢谢!