我们有必要在工程中写查询索引库的代码前先进行必要的测试。我们先到Solr服务页面去简单进行查询,如下图所示,在搜索条件"q"这一栏,我们输入"手机",分页参数的每页显示条数我们随便写一个数,这里我写的是3,也就是一次只查询三条数据,由于在查询条件一栏没有指定搜索域,因此默认搜索域一定要指定,否则无法查询出数据,我们在solr服务器的schema.xml文件当中配置了复制域"item_keywords",我们的默认搜索域便使用复制域"item_keywords"。我们知道在天猫或者京东,当搜索出结果后关键字是高亮显示的,我们也应该有高亮显示效果,我们点击"hl"前面的复选框就会展开如下图关于高亮显示的配置,让我们指定要高亮显示的字段以及高亮显示的html代码(在关键字前面和后面都有,比如<em>手机</em>)。点击"Execute Query"按钮便可以查询到如下图右侧的数据,上面是查询出来的商品列表信息,下面是高亮信息"highlighting"。
大家应该注意到下图高亮数据部分有一条查询结果是空的("143771131488369":{}),这是因为这条数据的item_title字段是"121"并没有关键字"手机",但是在商品
分类中有"手机",于是认为该商品也符合搜索条件(复制域的意思是把各个字段的值都复制到"item_keywords"当中,查询的时候,
只要满足其中一个字段的条件便认为是满足条件),但由于"item_title"字段没有"手机",
因此显示的高亮结果是"143771131488369":{}
针对上面的查询条件,我们使用java测试代码来跑一遍,代码如下所示。
@Test
public void queryDocument() throws Exception{
//创建一个SolrServer对象,创建一个HttpSolrServer对象,需要指定solr服务的url
SolrServer solrServer = new HttpSolrServer("http://192.168.156.22:8080/solr/collection1");
//创建一个SolrQuery对象
SolrQuery query = new SolrQuery();
//设置查询条件、过滤条件、分页条件、排序条件、高亮
//query.set("q", "*:*");
query.setQuery("手机");
//分页条件
query.setStart(0);
query.setRows(3);
//设置默认搜索域
query.set("df", "item_keywords");
//设置高亮
query.setHighlight(true);
//高亮显示的域
query.addHighlightField("item_title");
query.setHighlightSimplePre("<em>");
query.setHighlightSimplePost("</em>");
//执行查询,得到一个Response对象
QueryResponse response = solrServer.query(query);
//取查询结果
SolrDocumentList solrDocumentList = response.getResults();
//取查询结果总记录数
System.out.println("查询结果总记录数:"+solrDocumentList.getNumFound());
for(SolrDocument document : solrDocumentList){
System.out.println(document.getFieldValue("id"));
//取高亮显示
Map<String,Map<String,List<String>>> highlighting = response.getHighlighting();
List<String> list = highlighting.get(document.getFieldValue("id")).get("item_title");
String itemTitle = "";
if(list != null && list.size() > 0){
itemTitle = list.get(0);
}else {
itemTitle = (String)document.get("item_title");
}
System.out.println(itemTitle);
System.out.println(document.get("item_sell_point"));
System.out.println(document.get("item_price"));
System.out.println(document.get("item_image"));
System.out.println(document.get("item_category_name"));
System.out.println("===============================================");
}
}
测试代码执行的结果如下图所示。