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是排序实现的更多相关文章

  1. Solr中Facet用法和Group用法

    Group分组划分结果,返回的是分组结果: Facet分组统计,侧重统计,返回的是分组后的数量: 一.Group用法: //组查询基础配置params.set(GroupParams.GROUP, & ...

  2. 详细分析 Java 中实现多线程的方法有几种?(从本质上出发)

    详细分析 Java 中实现多线程的方法有几种?(从本质上出发) 正确的说法(从本质上出发) 实现多线程的官方正确方法: 2 种. Oracle 官网的文档说明 方法小结 方法一: 实现 Runnabl ...

  3. 【Lucene3.6.2入门系列】第03节_简述Lucene中常见的搜索功能

    package com.jadyer.lucene; import java.io.File; import java.io.IOException; import java.text.SimpleD ...

  4. Lucene中的 Query对象

    "Lucene中的 Query对象": 检 索前,需要对检索字符串进行分析,这是由queryparser来完成的.为了保证查询的正确性,最好用创建索引文件时同样的分析器. quer ...

  5. lucene 中关于Store.YES 关于Store.NO的解释

    总算搞明白 lucene 中关于Store.YES  关于Store.NO的解释了 一直对Lucene Store.YES不太理解,网上多数的说法是存储字段,NO为不存储. 这样的解释有点郁闷:字面意 ...

  6. solr中facet及facet.pivot理解(整合两篇文章保留参考)

    Facet['fæsɪt]很难翻译,只能靠例子来理解了.Solr作者Yonik Seeley也给出更为直接的名字:导航(Guided Navigation).参数化查询(Paramatic Searc ...

  7. solr中facet及facet.pivot理解

    Facet['fæsɪt]很难翻译,只能靠例子来理解了.Solr作者Yonik Seeley也给出更为直接的名字:导航(Guided Navigation).参数化查询(Paramatic Searc ...

  8. Lucene 中自定义排序的实现

    使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要的.Lucene中Build-in的几个排序定义在大多数情况下是不适合我们使用的.要适合自己的应用程序的场景,就只能自定义排序功能,本节我们 ...

  9. Lucene 中的Tokenizer, TokenFilter学习

      lucene中的TokenStream,TokenFilter之间关系   TokenStream是一个能够在被调用后产生语汇单元序列的类,其中有两个类型:Tokenizer和TokenFilte ...

随机推荐

  1. 数据库之MySQL(二)

    数据表基本 1.创建表 create table 表名(   列名  类型  是否可以为空,   列名  类型  是否可以为空)ENGINE=InnoDB DEFAULT CHARSET=utf8 是 ...

  2. OpenCV3计算机视觉+Python(五)

    人脸检测和识别 本章将介绍Haar级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配.本章将考虑如何将多个Haar级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人 ...

  3. Django序列化

    一.Django序列化    1.序列化应用场景     1.关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,由于httpresponse只能返回字符串或者是字节,而从数据库 ...

  4. 剑指offer 面试5题

    面试5题: 题目:请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 方法一: # -*- co ...

  5. 前端之 JQuery

    一.基本选择器 1.#id 概述: 根据给定的ID匹配一个元素. 使用任何的元字符(如 !"#$%&'()*+,./:;<=>?@[\]^`{|}~)作为名称的文本部分, ...

  6. smarty变量调节器与函数

    smarty自带了一些变量调节器与内置函数,都在libs/plugins目录下,变量调节器以modifier开头,函数以function开头,而且我们可以自定义变量调节器与函数,熟练运用之后会极大地提 ...

  7. The Maximum Unreachable Node Set 【17南宁区域赛】 【二分匹配】

    题目链接 https://nanti.jisuanke.com/t/19979 题意 给出n个点 m 条边 求选出最大的点数使得这个点集之间 任意两点不可达 题目中给的边是有向边 思路 这道题 实际上 ...

  8. Python学习进程(14)异常处理

        本节介绍Python进行异常处理的方式,异常处理机制可以帮助我们调试python程序.     (1)异常的简介:     异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行 ...

  9. $《第一行代码:Android》读书笔记——第2章 Activity

    (一)创建活动 1.创建活动类 创建没有Activity的项目,发现src文件夹是空的,手动创建一个包com.jyj.demo1,在包中添加一个名为MainActivity的class,该MainAc ...

  10. Vuex 原理

    1.Vuex是什么? 学院派:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式:集中存储和管理应用的所有组件状态. 理解:以上这4个词是我们理解的关键.状态:什么是状态,我们可以通俗的理 ...