zoukankan      html  css  js  c++  java
  • Lucene中分组统计(GroupBy)及去重(Distinct)性能在数量级上提升解决方案 Lucene高性能

    在2010年的时候,写过两篇关于LUCENE高性能GROUP BY、DISTINCT的文章,最近在研究LUCENE的过程中发现了一个名为FieldCache的东东,于是乎重新改进Lucene高性能GROUP BY、DISTINCT,发现性能有了数量级别的提升,究竟是因为啥让它有了如此之高的性能提升呢?下面我就来为大家揭开这个谜团!

    FieldCache是啥?

    我们知道,如果对每一个文档号都用reader 读取域的值会影响速度,所以Lucene 引入了FieldCache 来进行缓存,而FieldCache 并非在存储域中读取,而是在索引域中读取,从而
    不必构造Document 对象,然而要求此索引域是不分词的,有且只有一个Token。

    讲到这里,我们似乎知道了一些东西,那就是,索引进LUCENE中数据至少会在两个地方有相关的存储,一个就是存储域,一个就是索引域。

    即然FieldCache说它是从索引域中读取,速度相对从存储域读取肯定快,为什么不用它呢?

    说干就干,经过一番折腾,得到下面的测试结果:

    环境:对100W条数据量,取出其中要分组的字段,当然这个字段是不分词索引进去的

    第一种方式:从Term区域读取

    View Code
    Dictionary<int, object> dictionary = new Dictionary<int, object>();
    Term startTerm
    = new Term("CompanyID");
    TermEnum te
    = indexReader.Terms(startTerm);
    if (te != null)
    {
    Term currTerm
    = te.Term();

    while ((currTerm != null) && (currTerm.Field() == startTerm.Field())) //term fieldnames are interned
    {
    //if (te.DocFreq() > 1)
    //{
    TermDocs td = indexReader.TermDocs(currTerm);
    while (td.Next())
    {
    dictionary.Add(td.Doc(), currTerm.Text());
    }
    //}
    if (!te.Next())
    {
    break;
    }
    currTerm
    = te.Term();
    }
    }

    取出100W个CompanyID耗时:共耗时20.9291356秒

    第二种方式:从FieldCache中读取

    View Code
    StringIndex stringIndex = FieldCache_Fields.DEFAULT.GetStringIndex(indexReader, "CompanyID");

    取出100W个CompanyID耗时:共耗时2.8249935秒

    补充:StringIndex有两个属性:lookup、order

    string[] lookup:按照字典顺序排列的所有term

    int[] order:  其中位置表中文档号,order[i]表示第i个document某个field包含的term在lookup中的位置

    获取docid对应的term的值:termValue = lookup[order[doc]]


    两者性能一目了然,我也不多说了,快去试试吧!

    最后当然也不忘了说一句,如果你的数据量是千万级别或上亿了,那你必须得考虑分布式计算、并行计算这一类的计术了,呵呵。

    StringIndex stringIndex = FieldCache_Fields.DEFAULT.GetStringIndex(indexReader, "CompanyID");
    
  • 相关阅读:
    hdu 1017 A Mathematical Curiosity 解题报告
    hdu 2069 Coin Change 解题报告
    hut 1574 组合问题 解题报告
    hdu 2111 Saving HDU 解题报
    hut 1054 Jesse's Code 解题报告
    hdu1131 Count the Trees解题报告
    hdu 2159 FATE 解题报告
    hdu 1879 继续畅通工程 解题报告
    oracle的系统和对象权限
    oracle 自定义函数 返回一个表类型
  • 原文地址:https://www.cnblogs.com/zengen/p/2020681.html
Copyright © 2011-2022 走看看