lucene中facet实现统计分析的思路——本质上和word count计数无异,像splunk这种层层聚合(先filed1统计,再field2统计,最后field3统计)lucene是排序实现
http://stackoverflow.com/questions/185697/the-most-efficient-way-to-find-top-k-frequent-words-in-a-big-word-sequence
http://www.geeksforgeeks.org/find-the-k-most-frequent-words-from-a-file/
http://cs.stackexchange.com/questions/26427/word-frequency-with-ordering-in-on-complexity
思路大致如下:
(1)hash表统计单词出现次数,然后寻找top k出现的,其中top k可以使用n*log(k)的堆思路,或者快排思路,或者是桶排序思路(以前fbt里实现实时的积分排序);
(2)使用trie来统计单词出现次数,然后便利trie,利用堆排序思路求top k;
(3)使用桶排序,尤其是当你知道最大出现次数时候,类似以前做fbt实现的实时积分排序,然后从大到小取出top k;
(4)用map reduce。
(5)直接排序,然后统计。
如果只是统计top K上面的思路没有任何问题,如果是统计所有的呢?则时间复杂度无疑是n*log(n),相当于是排序了,和5一样!
lucene里是如何做的呢?
下面三篇文章针对源码分析提到了:
http://wandzk.iteye.com/blog/2187858
http://wandzk.iteye.com/blog/2187975
http://wandzk.iteye.com/blog/2188229
摘录最核心和本质的东西:
- 例子中有如下docs:
Doc0:
doc.add(new SortedSetDocValuesFacetField("Author", "Bob"));
doc.add(new SortedSetDocValuesFacetField("Publish Year", "2010"));
Doc1:
doc.add(new SortedSetDocValuesFacetField("Author", "Lisa"));
doc.add(new SortedSetDocValuesFacetField("Publish Year", "2010"));
Doc2:
doc.add(new SortedSetDocValuesFacetField("Author", "Lisa"));
doc.add(new SortedSetDocValuesFacetField("Publish Year", "2012"));
Doc3:
doc.add(new SortedSetDocValuesFacetField("Author", "Susan"));
doc.add(new SortedSetDocValuesFacetField("Publish Year", "2012"));
Doc4:
doc.add(new SortedSetDocValuesFacetField("Author", "Frank"));
doc.add(new SortedSetDocValuesFacetField("Publish Year", "1999"));- 根据上章分析所有的dim(就是filed name,此处为author和publish year),label(filed value) 将会拼接在一起,而且生成termid, 其term id 与term对应关系如下:
- (注lucene存贮字符串是用utf8存储为了便于理解这里还是用字符串显示但是中间分隔符是1f)
- ----- "Author1fBob"
- ----- "Publish Year1f2010"
- ----- "Author1fLisa"
- ----- "Publish Year1f2012"
- ----- "Author1fSusan"
- ----- "Author1fFrank"
- ----- "Publish Year1f1999"
- sortedValues 在排序后就是: [0, 5, 2, 4, 6, 1, 3]
同时它会记录每个doc id对应的所有term ids,因为每个filed value都有filed id嘛!
lucene做聚合的本质是:排序!例如要实现聚合:先filed1统计,再field2统计,最后field3统计。那么lucene的处理思路是filed1+2+3所有的字段值都事先排序!(当然,要先设置好filed1,2,3是facet filed,动态设置应该不支持!)
搜索的时候,根据搜索到的所有id,去filed1+2+3字段值排序好的来过滤,例如先过滤所有包含field1的,针对排序做统计!
针对单个filed1聚合的时间复杂度:(字段123所有的数值)*log(字段123所有的数值);后续的聚合分析,例如再针对filed2聚合,排序来做!
lucene中facet实现统计分析的思路——本质上和word count计数无异,像splunk这种层层聚合(先filed1统计,再field2统计,最后field3统计)lucene是排序实现的更多相关文章
- Solr中Facet用法和Group用法
Group分组划分结果,返回的是分组结果: Facet分组统计,侧重统计,返回的是分组后的数量: 一.Group用法: //组查询基础配置params.set(GroupParams.GROUP, & ...
- 详细分析 Java 中实现多线程的方法有几种?(从本质上出发)
详细分析 Java 中实现多线程的方法有几种?(从本质上出发) 正确的说法(从本质上出发) 实现多线程的官方正确方法: 2 种. Oracle 官网的文档说明 方法小结 方法一: 实现 Runnabl ...
- 【Lucene3.6.2入门系列】第03节_简述Lucene中常见的搜索功能
package com.jadyer.lucene; import java.io.File; import java.io.IOException; import java.text.SimpleD ...
- Lucene中的 Query对象
"Lucene中的 Query对象": 检 索前,需要对检索字符串进行分析,这是由queryparser来完成的.为了保证查询的正确性,最好用创建索引文件时同样的分析器. quer ...
- lucene 中关于Store.YES 关于Store.NO的解释
总算搞明白 lucene 中关于Store.YES 关于Store.NO的解释了 一直对Lucene Store.YES不太理解,网上多数的说法是存储字段,NO为不存储. 这样的解释有点郁闷:字面意 ...
- solr中facet及facet.pivot理解(整合两篇文章保留参考)
Facet['fæsɪt]很难翻译,只能靠例子来理解了.Solr作者Yonik Seeley也给出更为直接的名字:导航(Guided Navigation).参数化查询(Paramatic Searc ...
- solr中facet及facet.pivot理解
Facet['fæsɪt]很难翻译,只能靠例子来理解了.Solr作者Yonik Seeley也给出更为直接的名字:导航(Guided Navigation).参数化查询(Paramatic Searc ...
- Lucene 中自定义排序的实现
使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要的.Lucene中Build-in的几个排序定义在大多数情况下是不适合我们使用的.要适合自己的应用程序的场景,就只能自定义排序功能,本节我们 ...
- Lucene 中的Tokenizer, TokenFilter学习
lucene中的TokenStream,TokenFilter之间关系 TokenStream是一个能够在被调用后产生语汇单元序列的类,其中有两个类型:Tokenizer和TokenFilte ...
随机推荐
- poj 1012 & hdu 1443 Joseph(约瑟夫环变形)
题目链接: POJ 1012: id=1012">http://poj.org/problem?id=1012 HDU 1443: pid=1443">http:// ...
- Android Integer.parseInt java.lang.NumberFormatException: Invalid int解决方法
解决方法: http获取的字符串minutes去空字符串处理minutes.replaceAll("\\D+","").replaceAll("\r& ...
- MYSQL:基础—主键
MYSQL:基础—主键 1.什么是主键 表中的每一行都应该具有可以唯一标识自己的一列(或一组列).而这个承担标识作用的列称为主键. 如果没有主键,数据的管理将会十分混乱.比如会存在多条一模一样的记录, ...
- Centos----本地yum源制作
本地YUM源制作 1. YUM相关概念 1.1. 什么是YUM YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的S ...
- RabbitMQ队列/Redis缓存
一.RabbitMQ队列 RabbitMQ安装(Centos7安装):1.安装依赖:yum install socat (不安装会报错)2.下载rpm包:wget http://www.rabbitm ...
- 转:CWebBrowser2去除边框、滚动条、右键菜单
http://blog.csdn.net/tangyin025/article/details/8675513 添加CWebBrowser2类 右键项目-〉Add-〉Class...-〉MFC-〉MF ...
- 【TopCoder】SRM159 DIV2总结
250分题:给出一些规则,问街道上哪些地方可以停车. 简单的模拟题,考察每条规则是否成立即可. 代码:StreetParking 500分题:实现集合的交,并和差运算. 交运算:一个数组放到集合中,遍 ...
- Nginx 常见报错
Nginx 常见报错 启动报错:[emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use) 原因:这个是nginx重启时经常遇到 ...
- js常用方法汇总
产生在m.n之间的随机整数 //Math.round()把数四舍五入为最接近的整数. function random(m, n) { return Math.round(Math.random() * ...
- 一、安装虚拟机,配置ip地址
一.安装linux 注意点: 一.选择最小化安装的时候,要自定义安装软件,必须要安装下面的 如果没有安装上面的,需要用下面的命令来查询安装 如果没有安装就会出现各种问题 二.分区简单介绍 1.至少要一 ...