在Apache Solr中的构面或分组(faceting)指的是将搜索结果分类到各种类别中。在本章中,我们将讨论Apache Solr中可用的faceting类型 -
构面或分组(faceting)命令被添加到任何正常的Solr查询请求,并且faceting计数在同一个查询响应中返回。
使用字段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。
[zyiz@ubuntu:/usr/local/solr/bin]$ ./post -c solr_sample books.csv
在执行上述命令时,给定books.csv
文件中的所有文档都将上传到Apache Solr。
现在对集合或核心:solr_sample
上的0
行字段 author
执行一个分面查询。
打开Apache Solr的Web UI,在页面的左侧,选中复选框facet,如下面的屏幕截图所示。
在选中复选框(facet)时,它会额外显示三个文本字段,以便传递构面搜索的参数。 现在,作为查询的参数,传递以下值。
q = *:*, rows = 0, facet.field = author
最后,通过单击执行查询按钮执行查询。如下所示 -
最后,通过单击执行查询按钮执行查询。得到如下结果-
它基于作者对索引中的文档进行分类,并指定每个作者贡献的图书数量。
以下是Java程序向Apache Solr索引查询文档。将此代码保存在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"); } } }
通过在终端中执行以下命令编译上述代码 -
[zyiz@ubuntu:/usr/local/solr/bin]$ javac HitHighlighting.java [zyiz@ubuntu:/usr/local/solr/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)]]