0

我需要构建一个系统,当任何新帖子与用户定义的规则匹配时触发通知。

例如,系统中有用户列表(比如说数百万)。并且有大量的帖子被添加(数量也很大)。

一些用户希望在任何新帖子符合他定义的规则时得到通知。

该规则是一些布尔表达式,它描述了帖子中应该(或不应该)包含哪些词。

例如,用户 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)。

您能否提供一些简短的建议或一些建议,我应该朝哪个方向去解决这个问题?

谢谢!

4

1 回答 1

2

我正在回答我自己的问题(不知道为什么以前没有找到它):

其中一种解决方案是使用 ElasticSearch Percolate Queries。

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-percolate-query.html

于 2017-10-29T19:03:23.917 回答