不久前我被介绍到 ElasticSearch重要术语聚合,并且对这个指标的好和相关性感到非常惊讶。对于那些不熟悉它的人来说,这是一个非常简单的概念——对于给定的查询(前景集),给定的属性会根据背景集的统计显着性进行评分。
例如,如果我们要查询英国交通警察中最重要的犯罪类型:
C = 5,064,554 -- total number of crimes
T = 66,799 -- total number of bicycle thefts
S = 47,347 -- total number of crimes in British Transport Police
I = 3,640 -- total number of bicycle thefts in British Transport Police
通常,自行车盗窃仅占犯罪的 1% (66,799/5,064,554),但对于处理铁路和车站犯罪的英国交通警察来说,7% 的犯罪 (3,640/47,347) 是自行车盗窃。这是频率显着增加的七倍。
“自行车盗窃”的意义将是[(I/S) - (T/C)] * [(I/S) / (T/C)] = 0.371...
在哪里:
- C是集合中所有文档的数量
- S是匹配查询的文档数
- T是具有特定术语的文档数
- I是同时与S和T相交的文档数
出于实际原因(我拥有的大量数据和巨大的 ElasticSearch 内存需求),我希望在 SQL 中或直接在代码中实现重要的术语聚合。
我一直在寻找一些可能优化这种查询的方法,特别是降低内存需求并提高查询速度,但代价是一些误差范围 - 但到目前为止我还没有破解它。在我看来,这:
- 变量C和S很容易缓存或查询。
- 变量T可以从Count-Min Sketch导出,而不是查询数据库。
- 然而,变量I似乎不可能从T的 Count-Min Sketch 推导出来。
我也在看MinHash,但从描述来看,它似乎不能在这里应用。
有谁知道一些有助于解决这个问题的聪明算法或数据结构?