我需要构建一个系统,当任何新帖子与用户定义的规则匹配时触发通知。
E.g。 系统中有用户列表(比方说数百万)。并且添加了一些帖子(也很多)。
有些用户希望在任何新帖子符合他定义的规则时收到通知。
规则是一些布尔表达式,用于描述帖子中应该(或不应该)包含哪些单词。
例如,用户A定义了以下规则:
“如果有任何新帖子包含”编程“或”编码“字样,我希望收到通知,但不应包含”javascript“字样。
伪逻辑表达式:
notify = (post.contains("programming") OR post.contains("coding")) AND NOT (post.contains("javascript"))
具有上述规则的用户应该收到有关此类帖子的通知:
“使用python编程最佳实践”
另一方面,不应通知具有上述规则的用户:
“使用javascript和nodejs编程后端”*
所以它类似于“反向(布尔)搜索”(不知道如何命名)。
我的意思是,在“直接”布尔搜索中,用户会输入“programming python”,并且会返回与编程和 python 匹配的所有帖子。
但我需要相反:提供帖子,我需要返回此帖子匹配的用户。
我想到的一个“转储”解决方案就是使用ElasticSearch。 在ElasticSearch中,我会存储用户定义的规则:
用户A - >规则 - (具有bool规则的关键字),用户B - >规则......)
当创建新帖子时,将使用此帖子的内容在ES中搜索规则的使用(它只是在规则中搜索帖子的单词的出现,而不应用任何布尔规则)。
因此我将过滤(减少)可能的用户。假设此步骤找到10000个用户。
这篇新帖子也将存储在ElasticSearch中(在另一个索引中)。
现在第二步,针对该单个帖子向ElasticSearch(msearch)索引(帖子索引)发出BULK搜索请求。
批量搜索请求将包含10000个查询(找到10000个用户),每个查询将包含个人用户的布尔规则(query-> boolean-> must ...等)。
因此,只会通知具有匹配规则的用户。
您对此解决方案有何看法?据我所知,弹性搜索只在搜索一些有限数量的第一个文档时很快,但我需要搜索几千个(第一步)。
也许apache spark更适合这个问题? (不熟悉它,只知道它可以处理大量数据,并想知道这个用例是否适合火花)。
请您给我一些简短的建议或一些建议,我应该在哪个方向解决这个问题?
谢谢!
答案 0 :(得分:1)
我正在回答我自己的问题(不知道为什么以前没找到它):
其中一个解决方案是使用ElasticSearch Percolate Queries。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-percolate-query.html