我们有必要在工程中正式编写查询索引库的代码之前先进行必要的测试。
我们先到Solr应用的页面去简单进行一下查询,如下图所示,在搜索条件q
这一栏中,我们输入手机
这样的关键字,分页参数中的每页显示条数我们随便写一个数,这里我写的是3,也就是说一次只查询三条数据。由于在查询条件一栏中没有指定搜索域,因此默认搜索域一定要指定,否则无法查询出数据,这里我们在Solr服务器的managed-schema文件中配置了一个复制域(即item_keywords),所以默认搜索域便可指定为该复制域。复制域的意思是把各个字段的值都复制到该域当中,查询的时候,只要满足其中一个字段的条件便认为是满足条件。
我们还应知道在天猫或者京东,当搜索出结果后关键字是高亮显示的,我们也应该有高亮显示的效果,我们点击hl
前面的框框就会展开如下图所示的关于高亮显示的配置,接着会让我们指定要高亮显示的字段以及高亮显示的html代码(在关键字前面和后面都有,比如<em>手机</em>
),最后点击Execute Query
按钮便可查询出下图右侧所示的数据,其中上面是查询出来的商品列表信息,下面是高亮显示信息(即highlighting)。
针对上面的查询操作,我们使用Java测试代码来跑一遍,在taotao-search-service工程的SolrJTest单元测试类中添加一个如下测试方法。
@Test
public void testQueryDocument() throws Exception {
// 1. 创建SolrClient对象,建立连接,需要指定url地址
// 和单机版Solr服务器建立连接
String baseURL = "http://192.168.81.133:8080/solr/core1"; // Solr服务器的地址,特别指定核1
SolrClient solrClient = new HttpSolrClient.Builder(baseURL)
.withConnectionTimeout(10000)
.withSocketTimeout(60000)
.build();
// 2. 创建SolrQuery对象,这里面就可以设置各种过滤条件、主查询条件以及排序
SolrQuery query = new SolrQuery();
// 3. 设置查询条件
query.setQuery("手机");
// 设置自己的分页查询条件
query.setStart(0); // 从0开始
query.setRows(3); // 每页取3条记录
// 设置默认搜索域
query.set("df", "item_keywords");
// 开启高亮显示
query.setHighlight(true);
query.addHighlightField("item_title"); // 添加高亮显示的域
query.setHighlightSimplePre("<em>"); // 设置高亮显示的前缀
query.setHighlightSimplePost("</em>"); // 设置高亮显示的后缀
// 4. 执行查询
QueryResponse response = solrClient.query(query);
// 5. 获取结果集
SolrDocumentList list = response.getResults();
System.out.println("查询的总记录数:" + list.getNumFound());
// 6. 遍历结果并打印出来
for (SolrDocument document : list) {
System.out.println("商品id:" + document.getFieldValue("id"));
String itemName = null;
// 取高亮显示
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
List<String> list2 = highlighting.get(document.getFieldValue("id")).get("item_title");
if (list2 != null && list2.size() > 0) {
itemName = list2.get(0); // 将高亮后的结果取出来
} else {
itemName = document.getFieldValue("item_title").toString();
}
System.out.println(itemName);
System.out.println(document.getFieldValue("item_sell_point").toString());
System.out.println(document.getFieldValue("item_price").toString());
System.out.println(document.getFieldValue("item_image").toString());
System.out.println(document.getFieldValue("item_category_name").toString());
System.out.println("--------------------------------------------------");
}
}
运行以上方法,你便能在Eclipse控制台中看到如下图所示的结果。