SolrNet高级用法(分页、Facet查询、任意分组):如果你在系统中用到了Solr的话,那么肯定会碰到从Solr中反推数据的需求,基于数据库数据生产索引后。
那么Solr索引的数据相对准确,在电商需求中经常会碰到菜单、导航分类(比如电脑、PC的话会有很多品牌)、新车二手车导航会有车的品牌。还会根据价格区间自由组合组成自定义查询条件。常用高级用法如下:
1、根据基础数据反推数据分类用于导航(电脑品牌、手机品牌、车的品牌)。
2、数据量大的要分页。
3、自定义价格区间。
4、时间段分组。
5、高亮。
以下我罗列三个我遇到的实际问题用来演示下SolrNet的实际用法。
高级查询场景一(Facet 查询)在卖车类电商网站中,你选择了指定城市,那么你肯定只想在查询条件中查询出该城市已有车源的品牌,这样用户选择的查询条件就是有效的。这里用到Solr的Facet语法,Facet我理解为分片或者分类查询。用Facet Field查询的结果则在返回值的FacetFields字段中,他会把所有品牌的id都罗列出来,返回一个KeyValue,结果中是返回所有的品牌和对应的车源数量。车源数量大于0的则是该地区对应的品牌数据。
ISolrOperations<solrquotepricecore> solr = ServiceLocator.Current.GetInstance<isolroperations<solrquotepricecore>>();
//查找城市
ISolrQuery q1 =
new
SolrQueryByField(
"provid"
,
"540000"
);
//省份ID
ISolrQuery q2 =
new
SolrQueryByField(
"cityid"
,
"542400"
);
//市ID
ISolrQuery q3 =
new
SolrQueryByField(
"selled"
,
"1"
);
//在售状态
IList<isolrquery> filter=
new
List<isolrquery>();
filter.Add(q1);
filter.Add(q2);
filter.Add(q3);
//分组
var facet =
new
FacetParameters()
{
Queries =
new
[]
{
new
SolrFacetFieldQuery(
"brandid"
),
}
};
QueryOptions options=
new
QueryOptions();
options.Facet = facet;
SolrMultipleCriteriaQuery qtbo =
new
SolrMultipleCriteriaQuery(filter,
"AND"
);
SolrQueryResults<solrquotepricecore> results = solr.Query(qtbo,options);
foreach (var f in results.FacetFields[
"brandId"
])
{
if
(f.Value >
0
)
Console.WriteLine(
"{0}: {1}"
, f.Key, f.Value);
}
上面是车源品牌,价格也一样,你想根据指定价格区间查询车源数据则就要用到任务分组。 任意分组的查询结果在返回值的FacetQueries中,遍历改keyvalue取值。
高级查询场景二(任意分组)
ISolrOperations<solrquotepricecore> solr = ServiceLocator.Current.GetInstance<isolroperations<solrquotepricecore>>();
ISolrQuery r1 =
new
SolrQueryByRange<decimal>(
"price"
,
0
, 3m);
ISolrQuery r2 =
new
SolrQueryByRange<decimal>(
"price"
,
3
.01m, 5m);
ISolrQuery r3 =
new
SolrQueryByRange<decimal>(
"price"
,
5
.01m, 8m);
ISolrQuery r4 =
new
SolrQueryByRange<decimal>(
"price"
,
8
.01m, 10m);
ISolrQuery r5 =
new
SolrQueryByRange<decimal>(
"price"
,
10
.01m, 15m);
ISolrQuery r6 =
new
SolrQueryByRange<decimal>(
"price"
,
15
.01m, 20m);
ISolrQuery r7 =
new
SolrQueryByRange<decimal>(
"price"
,
20
.01m, 30m);
ISolrQuery r8 =
new
SolrQueryByRange<decimal>(
"price"
,
30
.01m, 50m);
ISolrQuery r9 =
new
SolrQueryByRange<decimal>(
"price"
,
50
.01m, 1000m);
var facet =
new
FacetParameters()
{
Queries =
new
[]
{
new
SolrFacetQuery(r1),
new
SolrFacetQuery(r2),
new
SolrFacetQuery(r3),
new
SolrFacetQuery(r4),
new
SolrFacetQuery(r5),
new
SolrFacetQuery(r6),
new
SolrFacetQuery(r7),
new
SolrFacetQuery(r8),
new
SolrFacetQuery(r9)
}
};
ISolrQuery q1 =
new
SolrQueryByField(
"provid"
,
"540000"
);
ISolrQuery q2 =
new
SolrQueryByField(
"cityid"
,
"542400"
);
ISolrQuery q3 =
new
SolrQueryByField(
"selled"
,
"1"
);
IList<isolrquery> filter =
new
List<isolrquery>();
filter.Add(q1);
filter.Add(q2);
filter.Add(q3);
QueryOptions options=
new
QueryOptions();
options.Facet = facet;
var qTBO =
new
SolrMultipleCriteriaQuery(filter,
"AND"
);
SolrQueryResults<solrquotepricecore> results = solr.Query(qTBO, options);
foreach (var f in results.FacetQueries)
{
Console.WriteLine(
"{0}: {1}"
, f.Key, f.Value);
}
高级查询场景三(分页)
QueryOptions options =
new
QueryOptions();
//分页参数
options.Rows = pageNum;
//数据条数
options.Start = start;
//开始项
// 拼接相关查询条件
//执行查询
SolrQueryResults<product> results = solr.Query(qTBO, options);
// 得到返回的数据总条数和total和 总页数 用于分页显示,
var total = results.NumFound;
var pageCount = total / pageNum +
1
;
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有