引子

最近在做一个日志系统,用普通关系型数据库做数据查询遇到了查询的瓶颈,想到了用成熟的搜索应用服务,我所知道的比较成熟的搜索应用服务有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 ?? ;
return items.Groups.Select(item => Convert.ToInt32(item.GroupValue)).ToList();
}
}

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

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

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

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

solr.net的使用的更多相关文章

  1. solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件

    昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...

  2. Solr 排除查询

    前言 solr排除查询也就是我们在数据库和程序中经常处理的不等于,solr的语法是在定语前加[-].. StringBuilder sbHtml=new StringBuilder(); shBhtm ...

  3. Solr高级查询Facet

    一.什么是facet solr种以导航为目的的查询结果成为facet,在用户查询的结果上根据分类增加了count信息,然后用户根据count信息做进一步搜索. facet主要用于导航实现渐进式精确搜索 ...

  4. [Solr] (源) Solr与MongoDB集成,实时增量索引

    一. 概述 大量的数据存储在MongoDB上,需要快速搜索出目标内容,于是搭建Solr服务. 另外一点,用Solr索引数据后,可以把数据用在不同的项目当中,直接向Solr服务发送请求,返回xml.js ...

  5. sorl6.0+jetty+mysql搭建solr服务

    1.下载solr 官网:http://lucene.apache.org/solr/ 2.目录结构如下 3.启动solr(默认使用jetty部署) 在path路径下将 bin文件夹对应的目录加入,然后 ...

  6. Solr Facet 默认值

    前言 今天在用Solr Facet遇到了默认值的问题,我用Facet.field查询发现数据总共100条,刚开始没有注意,发现少个别数据,但是用这几个个别的id查询又能查出来数据.才发现是Facet默 ...

  7. solr添加多个core

    在D:\solr\solr_web\solrhome文件夹下: 1)创建core0文件夹 2)复制D:\solr\solr_web\solrhome\configsets\basic_configs/ ...

  8. solr定时更新索引遇到的问题(SolrDataImportProperties Error loading DataImportScheduler properties java.lang.NullPointerException)

    问题描述 报如下错误,很显然,问题原因:空指针异常: ERROR (localhost-startStop-1) [   ] o.a.s.h.d.s.SolrDataImportProperties ...

  9. Solr实战:使用Hue+Solr实现标签查询

    公司最近在研究多条件组合查询方案,Google的一位技术专家Sam和我们讨论了几个备选方案. Sam的信: 我做了进一步研究,目前有这么几种做法: 1) 最直接粗暴,只做一个主index,比如按行业+ ...

随机推荐

  1. .Net语言 APP开发平台——Smobiler学习日志:如何快速实现地图定位时的地点微调功能

    Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 二.地点微调代码 VB: Dim ...

  2. 【C#公共帮助类】 Log4net 帮助类

    首先,我们要在Common类库中引用log4net.dll ExtLogImpl.cs using System; using System.Collections.Generic; using Sy ...

  3. 怎么解决tomcat占用8080端口问题

        怎么解决tomcat占用8080端口问题 相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现 Several ports (8080, 8009) requir ...

  4. 记录一次bug解决过程:velocity中获取url中的参数

    一.总结 在Webx的Velocity中获取url中参数:$rundata.getRequest().getParameter('userId') 在Webx项目中,防止CSRF攻击(Cross-si ...

  5. go-使用 unsafe 修改 struct 中的 field 的值

    以下是方法,不要纠结原理,等东西积累多了,你才有能力纠结原理: 首先,你需要有一个这样的函数,这是在 nsq 的源码里直接抄过来的: func unsafeValueOf(val reflect.Va ...

  6. 【夯实PHP基础】PHP的反射机制

    本文地址 分享提纲: 1. 介绍 2. 具体例子 2.1 创建Persion类 2.2 反射过程 2.3 反射后使用 1. 介绍 -- PHP5添加了一项新的功能:Reflection.这个功能使得p ...

  7. html和html5详解

    最近看群里聊天聊得最火热的莫过于手机网站和html5这两个词.可能有人会问,这两者有什么关系呢?随着这移动互联网快速发展的时代,尤其是4G时代已经来临的时刻,加上微软对"XP系统" ...

  8. opts=opts | |{}

    var opts=opts || {}这个语句是一个赋值或者初始化语句 该语句在opts已经被初始化过后opts的值不变,即执行var opts=opts这一部分. 当opts未被初始化,即typeo ...

  9. 【原】EasyUI ComboGrid 集成分页、按键示例

    需求: 1.下拉框下拉时出现表格: 2.表格带分页功能: 3.可以使用向上键.向下键在表格中移动选择行数据: 4.可以使用回车键在表格中选中行数据: 5.在下拉框的文本框中输入内容,能查询表格: 6. ...

  10. window7 桌面新建快捷方式方法

    点击开始按钮 所有程序 找到某个文件夹点开,找到文件夹里的快捷方式图标,右键--属性-- 复制 目标:上图蓝色内容. 回到桌面,右键--新建--快捷方式--把复制的内容粘贴到  请键入对象的位置-- ...