solr复杂查询
q:查询的关键字
必须的
请求的q是字符串,如果查询所有使用*:*
fq:(filter query)过滤查询
作用
- 查询在q查询结果的基础上同时符合fq查询条件的数据
- 请求fq是一个数组(多个值)
过滤查询价格从1到20的记录。
也可以使用“*”表示无限,例如:
20以上:product_price:[20 TO *]
20以下:product_price:[* TO 20]
sort:排序
desc代表降序,asc代表升序
start
开始的下标
rows
每页显示的记录数
fl
(Field List)指定返回那些字段内容,用逗号或空格分隔多个。
显示商品id、商品名称、商品分类名称
df
默认搜索的域
wt
(writer type)指定输出格式,可以有 xml, json, php, phps
hl
是否高亮 ,设置高亮Field,设置格式前缀和后缀。
solrj的复杂查询
package com.itheima.test;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.junit.Test;
public class SolrJGaojiTest {
@Test
public void testName() throws Exception {
// 1.创建连接
SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
// 2.创建查询条件对象
SolrQuery query = new SolrQuery();
// 3.设置条件
// 设置查询条件
query.setQuery("台灯");
// 设置过滤条件
query.setFilterQueries("product_catalog_name:雅致灯饰");
query.setFilterQueries("product_price:[20 TO 40]");
// 设置排序
query.setSort("product_price", ORDER.desc);
// 设置分页
query.setStart(0);// 开始下标
query.setRows(5);// 每页显示的条数
// 设置返回的数据
query.setFields("id,product_name,product_price,product_catalog_name");
// 设置默认域
query.set("df", "product_keywords");
// 设置高亮的域
query.addHighlightField("product_name");
// 设置高亮的前缀
query.setHighlightSimplePre("<span style=\"color:red\">");
// 设置高亮的后缀
query.setHighlightSimplePost("</span>");
// 4.执行查询,返回响应
QueryResponse queryResponse = solrServer.query(query);
// 5.根据这个响应获取结果集(文档集合)
SolrDocumentList solrDocumentList = queryResponse.getResults();
System.out.println("查询到的总数是:" + solrDocumentList.getNumFound());
// 6.遍历文档
for (SolrDocument doc : solrDocumentList) {
String productName = "";
// 获取高亮
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
// 获取高亮的数据
List<String> list = highlighting.get(doc.get("id")).get("product_name");
if (list != null) {
productName = list.get(0);
} else {
productName = String.valueOf(doc.get("product_name"));
}
// 7.打印数据
System.out.println("id:" + doc.get("id"));
System.out.println("商品名称:" + productName);
System.out.println("商品价格:" + doc.get("product_price"));
System.out.println("商品描述:" + doc.get("product_catalog_name"));
}
}
}
案例
需求
使用Solr实现电商网站中商品信息搜索功能,可以根据关键字搜索商品信息,根据商品分类、价格过滤搜索结果,也可以根据价格进行排序,实现分页
功能分析
高级搜索
- 条件回显
- 关键字查询
过滤查询
- 商品类别
- 商品价格
排序
价格排序
商品列表
- 商品信息
- 图片
- 名称
- 价格
- 高亮
- 总记录数
- 分页
架构分析
springMVC框架
dao层
- @reposity
- 连接solr服务器
service层
- @Service
- 处理业务
web层
- 扫描包注解
- 配置三大组件
web.xml
- 前端控制器