分面搜索
SolrNet支持分面搜索。
基本上有三种方面查询:
按字段查询
日期分面
任意分面查询
分面查询通过QueryOptions的FacetQueries属性发出。 然后QueryOptions实例被传递到服务器实例。
分面限制
有可能,您用作分面的字段可能具有太多的值,因此您可能想要限制应显示多少个值。 为此,我们在SolrFacetFieldQuery中具有Limit属性。
只需将Limit设置为您希望Solr返回特定分面的值的数量。
var fq = new SolrFacetFieldQuery("pepe") {Limit = 5};
或者另一方面,你的项目需要返回所有facet,因为Solr的Limit的默认值是100,那么你可能需要设置一个更高的数字,甚至是一个无限的值-1。 建议的意思是,为了性能的考虑,你只设置你所需要的,而不是无限的。
按字段查询
按字段查询由SolrFacetFieldQuery类处理。 可以通过FacetFields属性获得结果。
示例:打印按热门程度排序的所有类别。
ISolrOperations<Document> solr = ...
var r = solr.Query(SolrQuery.All, new QueryOptions {
Rows = 0,
Facet = new FacetParameters {
Queries = new[] {new SolrFacetFieldQuery("category")}
}
});
foreach (var facet in r.FacetFields["category"]) {
Console.WriteLine("{0}: {1}", facet.Key, facet.Value);
}
日期分面
日期分面查询根据日期范围创建构面。 示例代码:
ISolrOperations<Product> solr = ...
var results = solr.Query(SolrQuery.All, new QueryOptions {
Facet = new FacetParameters {
Queries = new[] {
new SolrFacetDateQuery("timestamp", new DateTime(2001, 1, 1).AddDays(-1) /* range start */, new DateTime(2001, 1, 1).AddMonths(1) /* range end */, "+1DAY" /* gap */) {
HardEnd = true,
Other = new[] {FacetDateOther.After, FacetDateOther.Before}
},
}
}
});
DateFacetingResult dateFacetResult = results.FacetDates["timestamp"];
foreach (KeyValuePair<DateTime, int> dr in dateFacetResult.DateResults) {
Console.WriteLine(dr.Key);
Console.WriteLine(dr.Value);
}
任意分面查询
任意分面查询由SolrFacetQuery类处理。 可以通过FacetQueries属性获得结果。
示例:按价格隔离商品(小于500美元 - 超过500美元)
ISolrOperations<Document> solr = ...
var lessThan500 = new SolrQueryByRange<decimal>("price", 0m, 500m);
var moreThan500 = new SolrQueryByRange<string>("price", "500", "*");
var r = solr.Query(SolrQuery.All, new QueryOptions {
Rows = 0,
Facet = new FacetParameters {
Queries = new[] {new SolrFacetQuery(lessThan500), new SolrFacetQuery(moreThan500)}
}
});
foreach (var facet in r.FacetQueries) {
Console.WriteLine("{0}: {1}", facet.Key, facet.Value);
}
多维面
数据透视面允许创建多维面。 您可以创建具有主类别和按子类别分组的数据透视面构面。
在本示例中,我将向您展示如何创建一个透视图构面,该构面将项目按inStock分隔,但按类别对它们进行分组。
请看下面的例子:
//创建一个facet Pivot Query
var facetPivotQuery = new SolrFacetPivotQuery()
{
//定义1个维度,由inStock分组cat
//也可以定义多个
Fields = new[] { new PivotFields("inStock", "cat") },
//Set the minCount to 1
MinCount = 1
};
//创建分面参数
//请注意,您可以与其他分面查询一起使用pivotQueries
var facetParams = new FacetParameters()
{
Queries = new[] { facetPivotQuery },
//将pivotRows的数量限制为15
Limit = 15
};
var queryOptions = new QueryOptions();
queryOptions.Facet = facetParams;
queryOptions.Rows = 0;
var results = solr.Query("*:*", queryOptions);
if (results.FacetPivots.Count > 0)
{
foreach (var pivotTable in results.FacetPivots)
{
System.Diagnostics.Debug.WriteLine("Pivot table for " + pivotTable.Key);
foreach (var pivot in pivotTable.Value)
{
System.Diagnostics.Debug.WriteLine(" Pivot: " + pivot.Field + " with value " + pivot.Value + ". Child Pivots:");
foreach (var pivotChild in pivot.ChildPivots)
{
System.Diagnostics.Debug.WriteLine(" - " + pivotChild.Value + " (" + pivotChild.Count + ")");
}
}
}
}
此示例将通过inStock(true或false)创建两个主要类别,然后按cat(类别)细分。 它将打印出以下内容:
Pivot: inStock with value true. Child Pivots:
- electronics (10)
- memory (3)
- hard drive (2)
- monitor (2)
- search (2)
- software (2)
- camera (1)
- copier (1)
- multifunction printer (1)
- music (1)
- printer (1)
- scanner (1)
Pivot: inStock with value false. Child Pivots:
- electronics (4)
- connector (2)
- graphics card (2)
```
Additional information to be found in:
http://wiki.apache.org/solr/HierarchicalFaceting#Pivot_Facets
http://wiki.apache.org/solr/SimpleFacetParameters#Pivot_.28ie_Decision_Tree.29_Faceting