文中使用的Solr版本是7.2.1 ;SolrNet版本是1.0.8.0 (nuget获取)
检索语句:
Solr普通检索:
domain/select?q=*:*
在Solr中使用分组检索
domain/select?q=*:*&group=true&group.field=分组字段&group.limit=1&group.ngroups=true
在Solr中看检索结果:
Solr的普通检索和分组检索结果集合并不相同,一个是集合,一个是字典
普通检索的结果
分组检索的结果:
使用SolrNet方法
普通检索:
var result = solr.Query(查询条件组合, 操作组合);
分组检索
注:只摘出一部分代码
//分组设置
GroupingParameters groupingParameters = new GroupingParameters();
groupingParameters.Limit = 1; //限制结果每个分组只有一个结果
groupingParameters.Fields = new List<string>();
groupingParameters.Fields.Add("分组字段");
groupingParameters.Ngroups = true; //用于返回得到的分组数,可用于分页
QueryOptions options = new QueryOptions();
options.Grouping = groupingParameters;
var result = solr.Query(排序集合, 操作组合); //此时得到的result.NumFound值为1
foreach (var item in result.Grouping)
{
if (string.IsNullOrEmpty(item.Key) == false)
{
var tmpResult = item.Value.Groups;
total = item.Value.Ngroups.ToInt(0);//这个才是得到的分组总数量
foreach (var doc in item.Value.Groups)
{
resultEntity.AddRange(doc.Documents);
}
}
}
2.
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(); } }