• 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");
    
  • 相关阅读:
    c 开发调试汇总
    中级 makefile
    flex
    asp.net的一个重要发现(Page_Load()的执行次序先控件的事件函数)。
    Google App Engine(GAE)入门教程翻译
    类QQ右下角弹出消息对话框(jQuery插件)
    c#过滤HTML代码
    python源码分析2
    asp.net(C#) 编码解码(HtmlEncode与HtmlEncode)
    js操作html的table,包括添加行,添加列,删除行,删除列,合并单元格(未实现)
  • 原文地址:https://www.cnblogs.com/zengen/p/2020681.html
Copyright © 2020-2023  润新知