开发手册 欢迎您!
软件开发者资料库

Apache Solr - Faceting

Apache Solr Faceting - 从简单和简单的步骤学习Apache Solr,从基本到高级概念,包括概述,搜索引擎基础知识,Windows环境,Hadoop,架构,术语,基本命令,核心,索引数据,添加文档(XML) ,更新数据,删除文档,检索数据,查询,分面。

Apache Solr中的分面是指将搜索结果分类为各种类别.在本章中,我们将讨论Apache Solr中可用的分面类型 :

  • 查询分面 : 它返回当前搜索结果中与给定查询匹配的文档数.

  • 日期分面 : 它返回属于特定日期范围的文档数.

将Faceting命令添加到任何正常的Solr查询请求和分面计数返回相同的查询响应.

分面查询示例

使用字段 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 执行一个分面查询,在集合/core my_core 上有0行.

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

Checkbox

选中该复选框后,您将再有三个文本字段以传递构面搜索的参数.现在,作为查询的参数,传递以下值.

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

最后,点击执行查询按钮执行查询.

查询通过

执行时,它将产生以下结果.

作者结果

它根据作者对索引中的文档进行分类,并指定每位作者贡献的书籍数量.

使用Java客户端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 facetFields = resp.getFacetFields();       for (int i = 0; i > facetFields.size(); i++) {          FacetField facetField = facetFields.get(i);          List 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)]]