“反向布尔搜索”或通过关键字(使用布尔规则)系统构建订阅的最佳方法是什么?

时间:2017-10-29 18:05:16

标签: elasticsearch bigdata subscription boolean-search

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

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更适合这个问题? (不熟悉它,只知道它可以处理大量数据,并想知道这个用例是否适合火花)。

请您给我一些简短的建议或一些建议,我应该在哪个方向解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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