Apache Solr 简明教程
Apache Solr - Faceting
Apache Solr 中的分层是指将搜索结果分类到各种类别中。在本章中,我们将讨论 Apache Solr 中提供的分层类型 −
-
Query faceting − 返回当前搜索结果中同时匹配给定查询的文档数。
-
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 复选框,如下面的屏幕截图所示。
选中复选框后,您将有另外三个文本字段来传递细分搜索的参数。现在,作为查询的参数,传递以下值。
q = *:*, rows = 0, facet.field = author
最后,通过单击 Execute Query 按钮执行查询。
执行后,将生成以下结果。
它基于作者对索引中的文档进行分类,并指定每个作者编著的图书数量。
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)]]