zoukankan      html  css  js  c++  java
  • solr.net的使用

    引子

     最近在做一个日志系统,用普通关系型数据库做数据查询遇到了查询的瓶颈,想到了用成熟的搜索应用服务,我所知道的比较成熟的搜索应用服务有solr和es(elasticsearch),由于时间比较仓促,最后选择了比较熟悉的solr。

    简介SOLR

    Solr是一个高性能,采用Java5开发,Solr基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎,他是基于Lucene的封装比较成熟的全文搜索服务器。solr怎样部署在windows服务器上的,推荐一枚信峰的博客http://www.cnblogs.com/wenxinghaha/tag/.net%20%20solr/,他这里写的比较详细。solr的5.0目前不支持IK分词,所以只好使用4.10版本,solr 的部署也比较方便,再部署的时间可以通过配置文件将数据库的数据索引到solr服务器内,并且能根据索引时间定时的同步数据到solr服务器。

    solr在.NET中的驱动

    我们在做查询的时间是使用过的C#语言,所以要用到solr在.NET中的驱动,目前比较流行的有solr.NET和easynet.solr,solr.NET是一个比较稳定的开源的solr驱动,easynet.solr是国内一同行在solr.NET上面做了封装,我采用的是最原生的solr.net,驱动下载地址https://github.com/mausch/SolrNet。由于solr服务器是提供restful接口的操作的,所以solrnet对于solr服务的请求其实还是基于http请求的

    solrnet的应用

    solrnet的应用我就做过多的说明了,在这里我主要是想说一下solrnet的分组查询

    附代码

     public  class SolrNetOperate
        {
            static SolrNetOperate()
            {
                Startup.Init<LogItems>("http://000.000.000.000:8080/solr/logs");
            }
    
            /// <summary>
            /// </summary>
            /// <param name="dictPars">查询参数字典</param>
            /// <param name="start">分页开始标识</param>
            /// <param name="rows">每页数量</param>
            /// <param name="startTime">开始时间</param>
            /// <param name="endTime">结束时间</param>
            /// <param name="count">输出参数 总个数</param>
            /// <returns></returns>
            /// <remarks>oldman 2015年7月23日14:11:43</remarks>
            public static List<int> GroupingSerach(Dictionary<string, string> dictPars, int start, int rows,
                DateTime startTime, DateTime endTime, out int count)
            {
                //定义solr
                var solr = ServiceLocator.Current.GetInstance<ISolrOperations<LogItems>>();
                var queryOptions = new QueryOptions();
                //定义分组
                var groupingParameters = new GroupingParameters();
                groupingParameters.Fields = new Collection<string> { "logs_id" };
                groupingParameters.Ngroups = true; //设置查询分组的总个数为true
                //定义过滤条件
                var timeRange = new SolrQueryByRange<DateTime>("logs_time", startTime, endTime);
                queryOptions.AddFilterQueries(timeRange);
                foreach (string key in dictPars.Keys)
                {
                    queryOptions.AddFilterQueries(new SolrQueryByField(key, dictPars[key]));
                }
                //定义排序
                queryOptions.OrderBy = new Collection<SortOrder> { new SortOrder("logs_id", Order.DESC) };
                queryOptions.Grouping = groupingParameters;
                queryOptions.Start = start;
                queryOptions.Rows = rows;
                SolrQueryResults<LogItems> res = solr.Query(SolrQuery.All, queryOptions);
                GroupedResults<LogItems> items = res.Grouping["logs_id"];
                count = items.Ngroups ?? 0;
                return items.Groups.Select(item => Convert.ToInt32(item.GroupValue)).ToList();
            }
        }

    这里是分组后做查询,排序和分页,代码很清晰,有问题可以和我交流

    附带源码:https://github.com/lipeng1991/SolrDemo

    本人的.NET学习技术交流群:226704167

    努力学习,只为一个梦想。

  • 相关阅读:
    C/C++内存对齐
    Fibonacci
    Count 1 in Binary
    Hash Function
    Fast Power
    Update Bits
    Unique Binary Search Trees
    Java知识体系(持续更新)
    如何发现牛股
    OpenResty究竟解决了什么痛点
  • 原文地址:https://www.cnblogs.com/lip0121/p/4799228.html
Copyright © 2011-2022 走看看