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和静态资源

从资料中拷贝

图片信息放到以下目录

3.4.3.3        Web.xml

3.4.3.4        配置springmvc.xml

原文链接 https://www.hanyuanhun.cn | https://node.hanyuanhun.cn

posted @   汉源魂  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示