用solr的facet实现聚合标签

Facet,单词意思是侧面,小平面。哈哈,怎么学英文单词了……

好吧,言归正题,solr的Facet是一个什么东西呢?我个人理解,反映一个搜索词的小平面(或者说某一个分组),起到标签聚合统计的功能。举个列子说,像我们公司的电商类网站那样的对搜索结果聚合分类,品牌等属性。如下图

这个是搜索铁观音这个词,统计了分类和品牌2个侧面(分组),铁观音在生活分类下有64个,茗茶里面48……

上面这个说到底,就是某一类型的标签统计,比如xxx年热词等等,只要有记录,也能统计出来,当然,超大数据量提前优化好solr的性能。

介绍了一下facet之后,来说说怎么实现facet。facet的实现其实很简单,主要在搜索参数上带上就OK。

facet=on/true      #代表开启facet
facet.field=cate  #代表要统计的面(分组),比如上面的分类,品牌,可以多次出现
facet.limit =20    #每个分组最多返回条数
facet.mincount = 1 #这个表示分组下某一条目的最小数据量
facet.missing = on/true #统计null的值
facet.method =   #默认为fc, fc表示Field Cache
比如:http://localhost/product/select/?q=铁观音&facet=on&facet.field=category&facet.field=brand&facet.mincount=1在搜索结果中返回xml的facet结果

01<lst name="facet_counts">
02<lst name="facet_queries"/>
03<lst name="facet_fields">
04<lst name="category">
05<int name="2742">64</int>
06<int name="793">48</int>
07<int name="2741">12</int>
08<int name="801">6</int>
09<int name="1087">1</int>
10</lst>
11<lst name="brand">
12<int name="229">74</int>
13<int name="227">16</int>
14<int name="270">13</int>
15<int name="317">10</int>
16<int name="0">4</int>
17<int name="165">4</int>
18<int name="203">3</int>
19<int name="147">2</int>
20<int name="166">2</int>
21<int name="217">1</int>
22<int name="342">1</int>
23<int name="343">1</int>
24</lst>
25</lst>

<lst name="category"> 分组名
<int name="2742">64</int> 分组内条目,name表示条目,64是统计结果数。

用solrJ那就更简单了

01ModifiableSolrParams params = new ModifiableSolrParams();
02params.set("fq", fq);
03params.set("facet", "on");
04params.set("facet.field", "category", "brand");
05params.set("facet.mincount", "1");
06params.set("facet.limit", "15");
07params.set("q","铁观音");
08QueryResponse qresponse = queryserver.query(params);
09FacetField facetField = qresponse.getFacetField(Facet_CATEGORY);
10List<Count> counts = null;
11if (facetField != null) {
12 counts = facetField.getValues();
13 if (counts != null) {
14 for (Count count : counts) {
15 System.out.println(count.getName()+" "+count.getCount());
16 }
17 }
18}

Facet应用很简单,schema上的索引字段都可以作为面统计

转载之处:点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Solr是一个基于Java的搜索引擎,可以用Java实现自定义排序。以下是实现自定义排序的步骤: 1. 创建一个自定义排序器类,实现org.apache.solr.search.SortComparator。 2. 在自定义排序器类中实现compare方法,该方法接收两个参数,即要比较的文档对象。 3. 在compare方法中实现自定义排序逻辑,根据需要将文档对象进行排序。 4. 在solrconfig.xml文件中配置自定义排序器,将其添加到fieldType中。 5. 在查询请求中指定使用自定义排序器。 下面是一个示例代码,演示了如何使用Java实现自定义排序器: ```java public class CustomSortComparator extends SortComparator { @Override public int compare(SortField sortField, SchemaField schemaField, FieldComparator<?> fieldComparator1, FieldComparator<?> fieldComparator2) throws IOException { // 获取要比较的文档对象 Object value1 = fieldComparator1.value(sortField.getReverse()); Object value2 = fieldComparator2.value(sortField.getReverse()); // 根据自定义逻辑进行排序 if (value1 instanceof Long && value2 instanceof Long) { Long long1 = (Long) value1; Long long2 = (Long) value2; if (long1 > long2) { return sortField.getReverse() ? -1 : 1; } else if (long1 < long2) { return sortField.getReverse() ? 1 : -1; } else { return 0; } } // 默认情况下,按照Solr默认的排序逻辑进行排序 return super.compare(sortField, schemaField, fieldComparator1, fieldComparator2); } } ``` 在solrconfig.xml文件中配置自定义排序器: ```xml <fieldType name="text_custom" class="solr.TextField"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> </analyzer> <sortComparator class="com.example.CustomSortComparator"/> </fieldType> ``` 在查询请求中指定使用自定义排序器: ```sh http://localhost:8983/solr/mycore/select?q=*:*&sort=custom_field+desc&fl=field1,field2&defType=edismax&wt=json ``` 以上代码演示了如何使用Java实现自定义排序器,通过实现compare方法自定义排序逻辑,将自定义排序器添加到fieldType中,在查询请求中指定使用自定义排序器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值