大家好,我最近在研究lucene,有一个问题,关于lucene关键字统计的问题,我想知道关键字在一个网页,一个文件,或者是数据库中字段属性里面出现的次数。根据统计,次数越多的的越靠前。进行分页。我在网上查了一些,但是没有这方面的资料。
   同时有谁对lucene的文件的读取有问题的可以问我,我们共同学习。

解决方案 »

  1.   

    给你个比较完整的例子 包括了 速度的优化部分 你自己研究下
    原理是 使用分组的列 来排序 然后统计个数            Query query = prequery(type, q);
                int sortname = 0;
                sortname = (int)(type.Replace("-", "").Length / 2);            //排序 此处只能用一列排序
                Sort st = new Sort();
                SortField[] sf = new SortField[] { 
                    new SortField("type"+sortname.ToString(),SortField.INT)
                };
                st.SetSort(sf);
                log("type" + sortname.ToString());
                DateTime start = DateTime.Now;
                DateTime end;
                //IndexSearcher _is = new IndexSearcher(path);            //StringBuilder sb = new StringBuilder();           
                //使用上次之缓存
                CachingWrapperFilter filter = new CachingWrapperFilter(new QueryFilter(query));            Dictionary<string, int> dc = new Dictionary<string, int>();
                //TopFieldDocs docs = _is.Search(query, null, 100000, st);
                TopFieldDocs docs = _is.Search(query, filter, 100000, st);            end = DateTime.Now;
                log("1 查出耗时 " + ((TimeSpan)(end - start)).TotalMilliseconds.ToString() + " ms !\r\n");
                //docs.scoreDocs数组对应查出的文档,仅包括排序字段的值
                for (int i = 0; i < docs.scoreDocs.Length; i++)
                {
                    FieldDoc fieldDoc = (FieldDoc)docs.scoreDocs[i];
                    //fieldDoc.fields数组对应每个排序字段
                    for (int j = 0; j < fieldDoc.fields.Length; j++)
                    {
                        String sortValue = fieldDoc.fields[j].ToString();                    if (dc.ContainsKey(sortValue))
                            dc[sortValue] += 1;
                        else
                            dc[sortValue] = 1;
                    }            }
                end = DateTime.Now;
                log("2 遍历统计耗时 " + ((TimeSpan)(end - start)).TotalMilliseconds.ToString() + " ms !\r\n");
                DataTable d = new DataTable();            if (dc.Count > 0)
                {                List<string> tp = new List<string>();
                    foreach (string k in dc.Keys)
                    {
                        if (k.Trim() != "")
                            tp.Add("'" + numAddGang(k) + "'");
                    }                //replace(type,'-','')
                    com.CommandText = "select name,type  from mytype where type in (" + string.Join(",", tp.ToArray()) + ")";
                    log(com.CommandText);                //Utilities.die(com.CommandText);
                    d = GenericDataAccess.ExecuteSelectCommand(com);                d.Columns.Add("num", typeof(int));                foreach (DataRow dr in d.Rows)
                    {
                        if (dc.ContainsKey(dr["type"].ToString().Replace("-", "")))
                        dr["num"] = dc[dr["type"].ToString().Replace("-", "")];
                    }                d.DefaultView.Sort = "num desc";
                    d = d.DefaultView.ToTable();            }
                return d;
      

  2.   

    欢迎高手进群讨论
    J2EE开发高级群:71929019
      

  3.   

    lucene的实例资料确实比较少 网上有的都是空洞的东西 不解决实际问题 数据量上了百万就歇菜了
     赶明我有空了 写个简单实用的