ITPub博客

首页 > 大数据 > 数据分析 > solr solrj Facet

solr solrj Facet

原创 数据分析 作者:破棉袄 时间:2015-07-06 10:41:06 0 删除 编辑

先看示例,再看概念


有这么一个字段:
  1. <field name="csFacetTwo" type="string" indexed="true" stored="false"/>

插入三条记录:
  1.         SolrInputDocument doc1 = new SolrInputDocument();
  2.         doc1.addField("rowkey","a1");
  3.         doc1.addField("csFacetTwo","电脑品牌1");
  4.         doc1.addField("title","笔记本电脑");
  5.         doc1.addField("size","14寸");
  6.         doc1.addField("count","双核");
  7.         
  8.         SolrInputDocument doc2 = new SolrInputDocument();
  9.         doc2.addField("rowkey","a2");
  10.         doc2.addField("csFacetTwo","电脑品牌2");
  11.         doc2.addField("title","笔记本电脑");
  12.         doc2.addField("size","14寸");
  13.         doc2.addField("count","双核");
  14.         
  15.         SolrInputDocument doc3 = new SolrInputDocument();
  16.         doc3.addField("rowkey","a3");
  17.         doc3.addField("csFacetTwo","电脑品牌3");
  18.         doc3.addField("title","笔记本电脑");
  19.         doc3.addField("size","14寸");
  20.         doc3.addField("count","双核");
  21.         
  22.         List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
  23.         docs.add(doc1);
  24.         docs.add(doc2);
  25.         docs.add(doc3);
  26.         try {
  27.             server.add(docs);
  28.             server.commit();
  29.             System.out.println("保存成功!");
  30.         } catch (SolrServerException e) {
  31.             e.printStackTrace();
  32.         } catch (IOException e) {
  33.             e.printStackTrace();
  34.         }
查询:
  1.         SolrQuery query = new SolrQuery();
  2.         query.setQuery("title:笔记本电脑");
  3.         query.setFacet(true);
  4.         query.addFacetField("csFacetTwo");
  5.         try {
  6.              QueryResponse response = server.query(query);
  7.              SolrDocumentList docs = response.getResults();
    1.   

  8.              List<FacetField> facetFields = response.getFacetFields();          //获取到Facet集合
    1.  
  9.              
  10.              for (SolrDocument doc : docs) {                                    //遍历主查询
  11.                 System.out.println("rowkey: " + doc.getFieldValue("rowkey"));
  12.              }
  13.              System.out.println();
  14.              for (FacetField facet:facetFields) {                               //遍历集合     
  15.                  System.out.println(facet.getName());
  16.                  System.out.println("----------------");
  17.                  List<Count> counts = facet.getValues();
  18.                  for(Count count : counts){
  19.                      System.out.println(count.getName()+":"+count.getCount());
  20.                  }                
  21.                      System.out.println();
  22.             }
  23.             
  24.         }catch (Exception e) {
  25.             e.printStackTrace();
  26.         }
打印结果:
rowkey: a1
rowkey: a2
rowkey: a3

csFaceTwo
----------------
电脑品牌1:1
电脑品牌2:1
电脑品牌3:1


概念:

solr将以导航为目的的查询结果称为facet. 它并不会修改查询结果信息, 只是在查询结果上根据分类添加了count信息
然后用户根据count信息做进一步的查询, 比如淘宝的查询列表中, 上面会表示不同的类目相关查询结果的数量.

Facet 的字段必须被索引 . 一般来说该字段无需分词 , 无需存储 .

无需分词是因为该字段的值代表了一个整体概念 , 如电脑的品牌 ” 某想 ” 代表了一个整体概念 , 如果拆成 ” 某 ”,” 想 ” 两个字都不具有实际意义 . 另外该字段的值无需进行大小写转换等处理 , 保持其原貌即可 .

无需存储是因为一般而言用户所关心的并不是该字段的具体值 , 而是作为对查询结果进行分组的一种手段 , 用户一般会沿着这个分组进一步深入搜索 .




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29754888/viewspace-1724182/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-07-16

  • 博文量
    180
  • 访问量
    1158157