Solr.NET快速入门(三)【Faceting】

分面搜索

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值