Solr案例
1.1 配置业务Field
1.1.1 需求
对京东案例中的products表的数据进行索引,所以需要先定义对应的Field域。
1.1.2 分析配置
Products的表结构
需要往索引库添加的字段有:
pid、name、catalog、catalog_name、price、description、picture
FieldType:
经分析,由于中文分词器已经配置完FieldType,所以目前FieldType已经满足需要,无需配置。
Field:
Pid:
由于pid在products表中是唯一键,而且在solr的shema.xml中已有一个id的唯一键配置,所以不需要再重新定义pid域。
<!-- Name:商品名称 -->
<field name="product_name" type="text\_ik" indexed="true" stored="true"/>
<!--Catalog、catalog_name: 商品分类ID -->
<field name="product_catalog" type="string" indexed="true" stored="true"/>
<!-- 商品分类名称 -->
<field name="product_catalog_name" type="string" indexed="true" stored="false"/>
<!-- Price:商品价格 -->
<field name="product_price" type="float" indexed="true" stored="true"/>
<!-- Description:商品描述 -->
<field name="product_description" type="text\_ik" indexed="true" stored="false"/>
<!-- Picture:商品图片地址 -->
<field name="product_picture" type="string" indexed="false" stored="true"/>
1.2 Dataimport
该插件可以将数据库中指定的sql语句的结果导入到solr索引库中。
1.2.1 第一步:添加jar包
l Dataimport的jar包,复制以下目录的jar包
添加到以下目录
修改solrconfig.xml文件,添加lib标签
<lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib" regex=".\*\\.jar" />
l MySQL数据库驱动包
将mysql的驱动包,复制到以下目录
修改solrconfig.xml文件,添加lib标签
<lib dir="${solr.install.dir:../..}/contrib/db/lib" regex=".\*\\.jar" />
1.2.2 第二步:配置requestHandler
在solrconfig.xml中,添加一个dataimport的requestHandler
1.2.3 第三步:创建data-config.xml
在solrconfig.xml同级目录下,创建data-config.xml
1.2.4 重启tomcat
2 Solrj的使用
2.1 什么是solrj
Solrj就是solr服务器的java客户端。
javaEE应用程序、SolrJ程序客户端、Solr服务、Tomcat |
2.2 环境准备
l Jdk、 Ide、 Tomcat、 Solrj
2.3 搭建工程
l Solrj的依赖包和核心包
l Solr的扩展服务包
2.4 使用solrj完成索引维护
2.4.1 添加/修改索引
在solr中,索引库中都会存在一个唯一键,如果一个Document的id存在,则执行修改操作,如果不存在,则执行添加操作。
2.4.2 删除索引
2.4.2.1 根据指定ID来删除
2.4.2.2 根据条件删除
2.4.3 查询索引
2.4.3.1 简单查询
2.4.3.2 复杂查询
2.4.3.2.1 solr的查询语法
1. q - 查询关键字,必须的,如果查询所有使用*😗。
请求的q是字符串
3 京东案例
3.1 需求
使用Solr实现电商网站中商品信息搜索功能,可以根据关键字、分类、价格搜索商品信息,也可以根据价格进行排序,同时还可以分页。
界面如下:
3.2 分析
3.2.1 UI分析
3.2.2 架构分析
应用服务器服务端:
表现层:使用springmvc接收前台搜索页面的查询条件等信息
业务层:调用dao层完成数据库持久化
如果数据库数据发生变化,调用solrj的客户端同步索引库。
Dao层:使用mybatis完成数据库持久化
Solrj服务器:
提供搜索和索引服务
数据库服务器:
提供数据库服务
spring容器 |
Service层、Dao层、Tomcat、Solr服务 |
3.3 工程搭建
l Solrj的jar包
l Solr的扩展包
l Springmvc的包
3.4 代码实现
3.4.1 Pojo
3.4.2 Service
Service接口
Service实现类
@Service public class ProductServiceImpl implements ProductService {
// 依赖注入HttpSolrServer @Autowired private HttpSolrServer server;
@Override public ResultModel getProducts(String queryString, String catalogName, String price, String sort, Integer page) throws Exception { // 创建SolrQuery对象 SolrQuery query = new SolrQuery();
// 输入关键字 if (StringUtils.isNotEmpty(queryString)) { query.setQuery(queryString); } else { query.setQuery("*:*"); }
// 输入商品分类过滤条件 if (StringUtils.isNotEmpty(catalogName)) { query.addFilterQuery("product_catalog_name:" + catalogName); }
// 输入价格区间过滤条件 // price的值:0-9 10-19 if (StringUtils.isNotEmpty(price)) { String[] ss = price.split("-"); if (ss.length == 2) { query.addFilterQuery("product_price:[" + ss[0] + " TO " + ss[1] + "]"); } }
// 设置排序 if ("1".equals(sort)) { query.setSort("product_price", ORDER.desc); } else { query.setSort("product_price", ORDER.asc); }
// 设置分页信息 if (page == null) page = 1;
query.setStart((page - 1) * 20); query.setRows(20);
// 设置默认域 query.set("df", "product_keywords");
// 设置高亮信息 query.setHighlight(true); query.addHighlightField("product_name"); query.setHighlightSimplePre("<font style=\"color:red\" >"); query.setHighlightSimplePost("</font>");
QueryResponse response = server.query(query); // 查询出的结果 SolrDocumentList results = response.getResults(); // 记录总数 long count = results.getNumFound();
List<Products> products = new ArrayList<>(); Products prod;
// 获取高亮信息 Map<String, Map<String, List<String>>> highlighting = response .getHighlighting(); for (SolrDocument doc : results) { prod = new Products();
// 商品ID prod.setPid(doc.get("id").toString());
List<String> list = highlighting.get(doc.get("id")).get( "product_name"); // 商品名称 if (list != null) prod.setName(list.get(0)); else { prod.setName(doc.get("product_name").toString()); }
// 商品价格 prod.setPrice(Float.parseFloat(doc.get("product_price").toString())); // 商品图片地址 prod.setPicture(doc.get("product_picture").toString());
products.add(prod); }
// 封装ResultModel对象 ResultModel rm = new ResultModel(); rm.setProductList(products); rm.setCurPage(page); rm.setRecordCount(count);
int pageCount = (int) (count / 20);
if (count % 20 > 0) pageCount++; // 设置总页数 rm.setPageCount(pageCount);
return rm; } }
|
3.4.3 Controller
3.4.3.1 代码
3.4.3.2 Jsp和静态资源
从资料中拷贝
图片信息放到以下目录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!