例如,如果我们在询问英国运输警察中最重要的犯罪类型:
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
Ordinarily,bicycle thefts represent only 1% of crimes (66,799/5,554) but for the British Transport Police,who handle crime on railways and stations,7% of crimes (3,640/47,347) is a bike theft. This is a significant seven-fold increase in frequency.
“(I / S) – (T / C)] * [(I / S)/(T / C)] = 0.371 …”
哪里:
> C是集合中所有文档的数量
> S是与查询匹配的文档数量
> T是具体术语的文档数量
>我是与S和T相交的文档数量
由于实际原因(我拥有的数据量非常大,而且还有很大的ElasticSearch内存要求),我正在寻求在sql中直接在代码中实现重要术语聚合.
我一直在寻找一些可能优化这种查询的方法,特别是降低内存需求并增加查询速度,牺牲一些错误的边缘 – 但到目前为止,我还没有破解.在我看来,这:
变量C和S易于缓存或可查询.
>变量T可以从Count-Min Sketch派生而不是查询数据库.
>然而,变量我似乎不可能用T来计算最小素描.
我也在看MinHash,但从描述看来,它不能应用于这里.
有谁知道一些聪明的算法或数据结构有助于解决这个问题?
解决方法
Lucene提前保持C和T的值.
S是从查询结果导出的简单计数,并且使用O(1)数据结构查找.主要成本是在所选领域中观察到的每个术语的许多T查找.使用min_doc_count通常有助于大大减少这些查找的数量.
For practical reasons (the sheer amount of data I have and huge ElasticSearch memory requirements
你是否考虑使用doc值来更好地管理弹性搜索记忆?见https://www.elastic.co/blog/support-in-the-wild-my-biggest-elasticsearch-problem-at-scale