Apache Solr 简明教程

Apache Solr - Faceting

Apache Solr 中的分层是指将搜索结果分类到各种类别中。在本章中,我们将讨论 Apache Solr 中提供的分层类型 −

  1. Query faceting − 返回当前搜索结果中同时匹配给定查询的文档数。

  2. Date faceting − 返回落入某个日期范围内的文档数。

分层命令被添加到任何正常 Solr 查询请求中,分层计数将在同一查询响应中返回。

Faceting Query Example

使用字段 faceting ,我们可以检索所有条目的计数,或者只是给定字段中的热门条目。

作为一个示例,让我们考虑以下包含有关各种图书的数据的 books.csv 文件。

id,cat,name,price,inStock,author,series_t,sequence_i,genre_s
0553573403,book,A Game of Thrones,5.99,true,George R.R. Martin,"A Song of Ice
and Fire",1,fantasy

0553579908,book,A Clash of Kings,10.99,true,George R.R. Martin,"A Song of Ice
and Fire",2,fantasy

055357342X,book,A Storm of Swords,7.99,true,George R.R. Martin,"A Song of Ice
and Fire",3,fantasy

0553293354,book,Foundation,7.99,true,Isaac Asimov,Foundation Novels,1,scifi
0812521390,book,The Black Company,4.99,false,Glen Cook,The Chronicles of The
Black Company,1,fantasy

0812550706,book,Ender's Game,6.99,true,Orson Scott Card,Ender,1,scifi
0441385532,book,Jhereg,7.95,false,Steven Brust,Vlad Taltos,1,fantasy
0380014300,book,Nine Princes In Amber,6.99,true,Roger Zelazny,the Chronicles of
Amber,1,fantasy

0805080481,book,The Book of Three,5.99,true,Lloyd Alexander,The Chronicles of
Prydain,1,fantasy

080508049X,book,The Black Cauldron,5.99,true,Lloyd Alexander,The Chronicles of
Prydain,2,fantasy

让我们使用 post 工具将此文件发布到 Apache Solr 中。

[Hadoop@localhost bin]$ ./post -c Solr_sample sample.csv

在执行上述命令后,给定的 .csv 文件中提到的所有文档将被上传到 Apache Solr 中。

让我们现在执行 author 字段上的分割查询,查询集合/核心 my_core 中的 0 行。

打开 Apache Solr 的 Web UI,在页面左侧选中 facet 复选框,如下面的屏幕截图所示。

checkbox

选中复选框后,您将有另外三个文本字段来传递细分搜索的参数。现在,作为查询的参数,传递以下值。

q = *:*, rows = 0, facet.field = author

最后,通过单击 Execute Query 按钮执行查询。

query pass

执行后,将生成以下结果。

author result

它基于作者对索引中的文档进行分类,并指定每个作者编著的图书数量。

Faceting Using Java Client API

以下是将文档添加到 Apache Solr 索引的 Java 程序。将此代码保存在名为 HitHighlighting.java 的文件中。

import java.io.IOException;
import java.util.List;

import org.apache.Solr.client.Solrj.SolrClient;
import org.apache.Solr.client.Solrj.SolrQuery;
import org.apache.Solr.client.Solrj.SolrServerException;
import org.apache.Solr.client.Solrj.impl.HttpSolrClient;
import org.apache.Solr.client.Solrj.request.QueryRequest;
import org.apache.Solr.client.Solrj.response.FacetField;
import org.apache.Solr.client.Solrj.response.FacetField.Count;
import org.apache.Solr.client.Solrj.response.QueryResponse;
import org.apache.Solr.common.SolrInputDocument;

public class HitHighlighting {
   public static void main(String args[]) throws SolrServerException, IOException {
      //Preparing the Solr client
      String urlString = "http://localhost:8983/Solr/my_core";
      SolrClient Solr = new HttpSolrClient.Builder(urlString).build();

      //Preparing the Solr document
      SolrInputDocument doc = new SolrInputDocument();

      //String query = request.query;
      SolrQuery query = new SolrQuery();

      //Setting the query string
      query.setQuery("*:*");

      //Setting the no.of rows
      query.setRows(0);

      //Adding the facet field
      query.addFacetField("author");

      //Creating the query request
      QueryRequest qryReq = new QueryRequest(query);

      //Creating the query response
      QueryResponse resp = qryReq.process(Solr);

      //Retrieving the response fields
      System.out.println(resp.getFacetFields());

      List<FacetField> facetFields = resp.getFacetFields();
      for (int i = 0; i > facetFields.size(); i++) {
         FacetField facetField = facetFields.get(i);
         List<Count> facetInfo = facetField.getValues();

         for (FacetField.Count facetInstance : facetInfo) {
            System.out.println(facetInstance.getName() + " : " +
               facetInstance.getCount() + " [drilldown qry:" +
               facetInstance.getAsFilterQuery());
         }
         System.out.println("Hello");
      }
   }
}

通过在终端中执行以下命令编译上述代码 -

[Hadoop@localhost bin]$ javac HitHighlighting
[Hadoop@localhost bin]$ java HitHighlighting

执行以上命令,您将获得以下输出。

[author:[George R.R. Martin (3), Lloyd Alexander (2), Glen Cook (1), Isaac
Asimov (1), Orson Scott Card (1), Roger Zelazny (1), Steven Brust (1)]]