查询索引
solr的查询语法
1. q
- 查询关键字,必须的,如果查询所有使用*😗。
请求的q是字符串
2. fq
- (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如::
请求fq是一个数组(多个值)
过滤查询价格从1到20的记录。
也可以在“q”查询条件中使用product_price:[1 TO 20],如下:
也可以使用“*”表示无限,例如:
20以上:product_price:[20 TO *]
20以下:product_price:[* TO 20]
3. sort - 排序,格式:sort= +<desc|asc>[, +<desc|asc>]… 。示例:
按价格降序
4. start - 分页显示使用,开始记录下标,从0开始
5. rows - 指定返回结果最多有多少条记录,配合start来实现分页。
实际开发时,知道当前页码和每页显示的个数最后求出开始下标。
6. fl - 指定返回那些字段内容,用逗号或空格分隔多个。
显示商品图片、商品名称、商品价格
7. df-指定一个搜索Field
也可以在SolrCore目录 中conf/solrconfig.xml文件中指定默认搜索Field,指定后就可以直接在“q”查询条件中输入关键字。
8. wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。
9. hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。
简单查询
@Test
public void queryIndex() throws Exception {
// 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
// 参数:solr服务器的访问地址
HttpSolrServer server = new HttpSolrServer(
"http://localhost:8080/solr/");
// 创建SolrQuery对象
SolrQuery query = new SolrQuery();
// 设置查询条件,名称“q”是固定的且必须 的
query.set("q", "id:2");
// 调用server的查询方法,查询索引库
QueryResponse response = server.query(query);
// 查询结果
SolrDocumentList results = response.getResults();
// 查询结果总数
long cnt = results.getNumFound();
System.out.println("查询结果总数:" + cnt);
for (SolrDocument solrDocument : results) {
System.out.println(solrDocument.get("id"));
System.out.println(solrDocument.get("product\_name"));
System.out.println(solrDocument.get("product\_price"));
System.out.println(solrDocument.get("product\_catalog\_name"));
System.out.println(solrDocument.get("product\_picture"));
}
}
复杂查询
复杂查询中包括高亮的处理
@Test
public void queryIndex2() throws Exception {
// 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
// 参数:solr服务器的访问地址
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");
// 创建SolrQuery对象
SolrQuery query = new SolrQuery();
// 设置查询条件
query.setQuery("钻石");
// 设置过滤条件
query.setFilterQueries("product\_catalog\_name:幽默杂货");
// 设置排序
query.setSort("product\_price", ORDER.desc);
// 设置分页信息
query.setStart(0);
query.setRows(10);
// 设置显得的域的列表
query.setFields("id", "product\_name", "product\_price",
"product\_catalog\_name", "product\_picture");
// 设置默认搜索域
query.set("df", "product\_name");
// 设置高亮
query.setHighlight(true);
query.addHighlightField("product\_name");
query.setHighlightSimplePre("<em>");
query.setHighlightSimplePost("</em>");
// 调用server的查询方法,查询索引库
QueryResponse response = server.query(query);
// 查询结果
SolrDocumentList results = response.getResults();
// 查询结果总数
long cnt = results.getNumFound();
System.out.println("查询结果总数:" + cnt);
for (SolrDocument solrDocument : results) {
System.out.println(solrDocument.get("id"));
String productName = (String) solrDocument.get("product\_name");
//获取高亮列表
Map<String, Map<String, List<String>>> highlighting = response
.getHighlighting();
//获得本文档的高亮信息
List<String> list = highlighting.get(solrDocument.get("id")).get(
"product\_name");
//如果有高亮,则把商品名称赋值为有高亮的那个名称
if (list != null) {
productName = list.get(0);
}
System.out.println(productName);
System.out.println(solrDocument.get("product\_price"));
System.out.println(solrDocument.get("product\_catalog\_name"));
System.out.println(solrDocument.get("product\_picture"));
}
}