下面就来讲一讲SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)。其实这些高级查询,说白了,也还是SolrNet 将Solr 的相关查询参数封装起来了,使得我们调用更加方便。但是实际上还是按照Solr 的参数规则,拼接查询参数,并向Solr 服务器发起请求。这就是所谓的万变不离其宗,这也是我前面花两篇文章,来总结Solr 的查询参数的初心。如果有兴趣可以监控SolrNet 发起的Http 请求,看看是不是按照solr 的查询参数规则来的。具体Solr的查询参数相关说明,请看这篇文章《Solr学习总结(四)Solr查询参数》
示例下载:Demo下载
1.复杂查询
说明:a. QueryOptions 查询的相关设置,分页属性,结果集排序,条件集合之间的关系(AND, OR)等。
b. ISolrQuery 查询条件,集合
c. SolrMultipleCriteriaQuery条件集合之间的关系,(AND,OR)
2.分页
分页其实也就是比查询,多设置了Rows和Start 参数。其他的和查询一致。最后返回的时候,除了返回查询结果,还要返回总页数和数据总条数
// 拼接相关查询条件 . .
. //执行查询 SolrQueryResults<Product> results = solr.Query(qTBO, options); // 得到返回的数据总条数和total和 总页数 用于分页显示, var total = results.NumFound; var pageCount = total / pageNum + 1;
3.高亮
4.Facet查询
Facet 本书还有很多参数来限制,选择结果集。这里只介绍了几个基本的Facet用法。其他的就不一一细说。大家自己去研究吧。
1. 普通分组,按照某个字段分组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var facet = new FacetParameters { Queries = new[] { new SolrFacetFieldQuery(“category”) } }; options.Facet = facet; var qTBO = new SolrMultipleCriteriaQuery(query, “AND”); SolrQueryResults<Product> results = solr.Query(qTBO, options); foreach (var f in results.FacetFields[“category”]) { Console.WriteLine(“{0}: {1}”, f.Key, f.Value); } |
2. 时间段分组
SolrFacetDateQuery 类里面的几个参数比较复杂。具体的可以去研究研究Date Facet 相关的参数说明。
// 时间分组
var facet = new FacetParameters
{
Queries = new[] {
new SolrFacetDateQuery(
”updatetime”,
new DateTime(2015, 11, 1) / 开始时间 /,
new DateTime(2015,12, 31) / 结束时间 /,
”+7DAY” / 时间间隔 /)
{
HardEnd = true,
Other = new[] {FacetDateOther.After, FacetDateOther.Before}
},
}
};
options.Facet </span>=<span style="color:#000000;"> facet;
</span><span style="color:#008000;">//</span><span style="color:#008000;">条件集合之间的关系</span>
<span style="color:#0000ff;">var</span> qTBO = <span style="color:#0000ff;">new</span> SolrMultipleCriteriaQuery(query, <span style="color:#800000;">"</span><span style="color:#800000;">AND</span><span style="color:#800000;">"</span><span style="color:#000000;">);
SolrQueryResults</span><Product> results =<span style="color:#000000;"> solr.Query(qTBO, options);
DateFacetingResult dateFacetResult </span>= results.FacetDates[<span style="color:#800000;">"</span><span style="color:#800000;">updatetime</span><span style="color:#800000;">"</span><span style="color:#000000;">];
</span><span style="color:#0000ff;">foreach</span> (KeyValuePair<DateTime, <span style="color:#0000ff;">int</span>> dr <span style="color:#0000ff;">in</span><span style="color:#000000;"> dateFacetResult.DateResults)
{
Console.WriteLine(dr.Key);
Console.WriteLine(dr.Value);
}</span>
3. 任意分组
// 按照价格段分组
var lessThan30 = new SolrQueryByRange<decimal>(”price”, 0m, 30m);
var lessThan70 = new SolrQueryByRange<decimal>(”price”, 30m, 70m);
var moreThan70 = new SolrQueryByRange<decimal>(”price”, 70m, 100m);
</span><span style="color:#0000ff;">var</span> facet = <span style="color:#0000ff;">new</span><span style="color:#000000;"> FacetParameters
{
Queries </span>= <span style="color:#0000ff;">new</span>[] { <span style="color:#0000ff;">new</span> SolrFacetQuery(lessThan30), <span style="color:#0000ff;">new</span> SolrFacetQuery(lessThan70), <span style="color:#0000ff;">new</span><span style="color:#000000;"> SolrFacetQuery(moreThan70) }
};
options.Facet </span>=<span style="color:#000000;"> facet;
</span><span style="color:#0000ff;">var</span> qTBO = <span style="color:#0000ff;">new</span> SolrMultipleCriteriaQuery(query, <span style="color:#800000;">"</span><span style="color:#800000;">AND</span><span style="color:#800000;">"</span><span style="color:#000000;">);
SolrQueryResults</span><Product> results =<span style="color:#000000;"> solr.Query(qTBO, options);
</span><span style="color:#0000ff;">foreach</span> (<span style="color:#0000ff;">var</span> f <span style="color:#0000ff;">in</span><span style="color:#000000;"> results.FacetQueries)
{
Console.WriteLine(</span><span style="color:#800000;">"</span><span style="color:#800000;">{0}: {1}</span><span style="color:#800000;">"</span><span style="color:#000000;">, f.Key, f.Value);
}</span>
4. Pivot faceting, Pivot 这个概念还是蛮难解释的,有点类似于BI 报表中的数据钻取,即 一层一层的进行分组 统计,例如 先按颜色,分组统计,然后在统计的结果集某个子分组里面,再按照 分类 进行分组统计。
<span style="color:#808080;">///</span> <span style="color:#808080;"><summary></span>
<span style="color:#808080;">///</span><span style="color:#008000;"> Facet 查询
</span><span style="color:#808080;">///</span> <span style="color:#808080;"></summary></span>
<span style="color:#808080;">///</span> <span style="color:#808080;"><param name="color"></param></span>
<span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> Query_FactPivot()
{
ISolrOperations</span><Product> solr = ServiceLocator.Current.GetInstance<ISolrOperations<Product>><span style="color:#000000;">();
</span><span style="color:#008000;">//</span><span style="color:#008000;">Create a facet Pivot Query</span>
<span style="color:#0000ff;">var</span> facetPivotQuery = <span style="color:#0000ff;">new</span><span style="color:#000000;"> SolrFacetPivotQuery()
{
</span><span style="color:#008000;">//</span><span style="color:#008000;">默认是 1 pivot, 先 category 再按 color 分组
</span><span style="color:#008000;">//</span><span style="color:#008000;">如果是多个,则在后面继续追加 ,new PivotFields("color", "category")</span>
Fields = <span style="color:#0000ff;">new</span>[] { <span style="color:#0000ff;">new</span> PivotFields(<span style="color:#800000;">"</span><span style="color:#800000;">color</span><span style="color:#800000;">"</span>, <span style="color:#800000;">"</span><span style="color:#800000;">category</span><span style="color:#800000;">"</span><span style="color:#000000;">)},
</span><span style="color:#008000;">//</span><span style="color:#008000;">最小记录数</span>
MinCount = <span style="color:#800080;">1</span><span style="color:#000000;">
};
</span><span style="color:#008000;">//</span><span style="color:#008000;">创建一个查询参数
</span><span style="color:#008000;">//</span><span style="color:#008000;">同时 pivotQueries 可以和其他查询条件一起混用</span>
<span style="color:#0000ff;">var</span> facetParams = <span style="color:#0000ff;">new</span><span style="color:#000000;"> FacetParameters()
{
Queries </span>= <span style="color:#0000ff;">new</span><span style="color:#000000;">[] { facetPivotQuery },
Limit </span>= <span style="color:#800080;">15</span><span style="color:#000000;">
};
</span><span style="color:#0000ff;">var</span> queryOptions = <span style="color:#0000ff;">new</span><span style="color:#000000;"> QueryOptions();
queryOptions.Facet </span>=<span style="color:#000000;"> facetParams;
queryOptions.Rows </span>= <span style="color:#800080;">0</span><span style="color:#000000;">;
</span><span style="color:#0000ff;">var</span> results = solr.Query(<span style="color:#800000;">"</span><span style="color:#800000;">*:*</span><span style="color:#800000;">"</span><span style="color:#000000;">, queryOptions);
</span><span style="color:#0000ff;">if</span> (results.FacetPivots.Count > <span style="color:#800080;">0</span><span style="color:#000000;">)
{
</span><span style="color:#0000ff;">foreach</span> (<span style="color:#0000ff;">var</span> pivotTable <span style="color:#0000ff;">in</span><span style="color:#000000;"> results.FacetPivots)
{
Console. WriteLine(</span><span style="color:#800000;">"</span><span style="color:#800000;">Pivot table for </span><span style="color:#800000;">"</span> +<span style="color:#000000;"> pivotTable.Key);
</span><span style="color:#0000ff;">foreach</span> (<span style="color:#0000ff;">var</span> pivot <span style="color:#0000ff;">in</span><span style="color:#000000;"> pivotTable.Value)
{
Console.WriteLine(</span><span style="color:#800000;">"</span><span style="color:#800000;"> Pivot: </span><span style="color:#800000;">"</span> + pivot.Field + <span style="color:#800000;">"</span><span style="color:#800000;"> with value </span><span style="color:#800000;">"</span> + pivot.Value + <span style="color:#800000;">"</span><span style="color:#800000;">. Child Pivots:</span><span style="color:#800000;">"</span><span style="color:#000000;">);
</span><span style="color:#0000ff;">foreach</span> (<span style="color:#0000ff;">var</span> pivotChild <span style="color:#0000ff;">in</span><span style="color:#000000;"> pivot.ChildPivots)
{
Console.WriteLine(</span><span style="color:#800000;">"</span><span style="color:#800000;"> - </span><span style="color:#800000;">"</span> + pivotChild.Value + <span style="color:#800000;">"</span><span style="color:#800000;"> (</span><span style="color:#800000;">"</span> + pivotChild.Count + <span style="color:#800000;">"</span><span style="color:#800000;">)</span><span style="color:#800000;">"</span><span style="color:#000000;">);
}
}
}
}
Console.ReadKey();
} </span>
这个是比较精细化,也更加复杂的Facet查询。这个由于本人实际中没有用到过。所以就不在这里多讲了。感兴趣的朋友,可以去研究研究,