【发布时间】:2014-07-23 03:37:29
【问题描述】:
在考虑某天我可能想要构建的各种应用程序的设计时,在某些情况下,我需要根据传入事件是否匹配用户提供的大量全文搜索查询。
此问题的一个简单示例是 Twitter 流式搜索之类的工具的实现:在每秒有数千条新推文的情况下,有效地仅选择搜索查询可能与传入推文匹配的流式订阅者。
问题的陈述类似于“反向全文搜索”,其中全文是查询,搜索结果是与该文本匹配的搜索查询。
对于单词查询,一个实现是显而易见的:只需对传入文档进行标记,然后搜索词->(订阅者列表)的映射,但是当布尔查询成为可能时,事情变得更加困难。事实上,这个问题比全文搜索更普遍,但在这种情况下最容易理解。还有许多其他示例需要将大量布尔项组合起来以优化评估它们的成本。
例如,假设有 3 个搜索订阅:
- 谷歌和眼镜
- 谷歌和分析
- ((Glass 和 Google)NOT Knol)或 Twitter
一种可能性是将查询解析为树,然后访问每个节点,提取术语,并使用“术语映射”方法,但这需要针对每个术语的传入文档重新评估订阅者查询.如果订阅者足够多,这将很快开始变慢。
相反,我想知道是否有一个有据可查的方法将查询重写为单个查询,其中可以评估一次结果,并且树节点使用完全或几乎肯定知道的订阅者查询列表进行注释匹配树中该点的任何文档。
例如,上面的查询可能会被重写,以便存在 term->(query tree) 的映射,例如:
Google -> (Analytics[2]
Glass[1,3])
Twitter -> ([3])
是否有任何现有的公开记录的系统可以做这样的事情?理想情况下,该解决方案将允许逐步添加和删除订阅者,而无需花费昂贵的步骤来重写整个结构。
【问题讨论】:
标签: algorithm data-structures full-text-search