有效地计算SQL中的重要术语
我是在不久前被介绍到ElasticSearch的,我对这个指标的良好性和相关性感到非常惊讶。对于那些不熟悉它的人来说,这是一个非常简单的概念——对于给定的查询(前景集),给定的属性根据背景集的统计显著性进行评分 例如,如果我们查询英国交通警察局最重要的犯罪类型:有效地计算SQL中的重要术语,sql,
elasticsearch,query-optimization,aggregation,significant-terms,Sql,
elasticsearch,Query Optimization,Aggregation,Significant Terms,我是在不久前被介绍到ElasticSearch的,我对这个指标的良好性和相关性感到非常惊讶。对于那些不熟悉它的人来说,这是一个非常简单的概念——对于给定的查询(前景集),给定的属性根据背景集的统计显著性进行评分 例如,如果我们查询英国交通警察局最重要的犯罪类型: C = 5,064,554 -- total number of crimes T = 66,799 -- total number of bicycle thefts S = 47,347 -- total number
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%(66799/5064554),但对于处理铁路和车站犯罪的英国交通警察来说,7%(3640/47347)的犯罪是自行车盗窃。这是一个显着的七倍增加的频率
“自行车盗窃”的意义是[(I/S)-(T/C)]*[(I/S)/(T/C)]=0.371…
其中:
- C是集合中所有文档的编号
- S是与查询匹配的文档数
- T是具有特定术语的文档数
- I是与S和T相交的文档数
出于实际原因(我拥有的数据量和巨大的ElasticSearch内存需求),我希望在SQL中或直接在代码中实现重要术语聚合 我一直在寻找一些可能优化此类查询的方法,特别是降低内存需求和提高查询速度,但以牺牲一些误差为代价——但到目前为止,我还没有破解它。在我看来:
- 变量C和S易于缓存或查询
- 变量T可以从a派生,而不是查询数据库
- 然而,变量I似乎无法从T中使用Count Min Sketch导出
有人知道一些聪明的算法或数据结构可以帮助解决这个问题吗?我怀疑SQL impl会更快。 C和T的值由Lucene提前保持。 S是从查询结果派生的简单计数,I使用O(1)数据结构进行查找。主要成本是对所选字段中观察到的每个术语进行多次T查找。使用min_doc_count通常有助于大幅减少这些查找的数量 出于实际原因(我拥有的数据量和巨大的ElasticSearch内存需求
您是否考虑过使用文档值更好地管理elasticsearch内存?请参阅对于前景集足够小的情况,一个有效的解决方案是可能的。这样,您就可以处理前景集中的所有文档了
- 计算Xk的显著性为(fk-fk/fk),其中fk=Tk/C是背景集中Xk的频率
从S中导出I。
您能详细说明一下吗?