赞
踩
Solr定时增量更新
ElasticSearch vs Solr多维度分析对比
JavaEE-面试-Solr面试回答思路
Lucene Solr 811
1.把 solr-8.1.1.tgz 传到服务器
//把文件传到 /usr/local 目录下
cd /usr/local
2.解压 solr
tar -xzf solr-8.1.1.tgz
3.启动 solr
cd /usr/local/solr-8.1.1
# 不建议使用管理员启动 solr,加 -force 强制启动
bin/solr start -force
# 开放 8983 端口
firewall-cmd --zone=public --add-port=8983/tcp --permanent
firewall-cmd --reload
4.浏览器访问 solr 控制台
http://192.168.64.170:8983
5.服务器创建 core
数据库中 pd_item 表中的商品数据, 在 solr 中保存索引数据, 在 solr 中创建一个 core 保存索引数据
创建一个名为 pd 的 core, 首先要准备以下目录结构:
# solr目录/server/solr/
# pd/
# conf/
# data/
cd /usr/local/solr-8.1.1
mkdir server/solr/pd
mkdir server/solr/pd/conf
mkdir server/solr/pd/data
6.复制默认配置
conf 目录是 core 的配置目录, 存储一组配置文件, 我们以默认配置为基础, 后续逐步修改
cd /usr/local/solr-8.1.1
cp -r server/solr/configsets/_default/conf server/solr/pd
7.中文分词测试
8.添加 ik-analyzer 分词器
#修改 solr目录/server/solr/pd/conf/managed-schema,添加 ik-analyzer 分词器
<!-- ik分词器 -->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
9.重启 solr 服务
cd /usr/local/solr-8.1.1
bin/solr restart -force
10.使用 ik-analyzer 对中文进行分词测试
11.设置停止词
上传停止词配置文件到 solr目录/server/solr-webapp/webapp/WEB-INF/classes
stopword.dic
stopwords.txt
重启服务,观察分词结果中,停止词被忽略
bin/solr restart -force
12.准备 mysql 数据库数据
用 sqlyog 执行 pd.sql
-授予 root 用户 跨网络访问权限
-注意: 此处设置的是远程登录的 root 用户,本机登录的 root 用户密码不变
CREATE USER 'root'@'%' IDENTIFIED BY 'root';
GRANT ALL ON *.* TO 'root'@'%';
-随机修改30%的商品,让商品下架,以便后面做查询测试
UPDATE pd_item SET STATUS=0 WHERE RAND()<0.3
13.从 mysql 导入商品数据
title text_ik
sellPoint text_ik
price plong
barcode string
image string
cid plong
status pint
created pdate
updated pdate
14.Copy Field 副本字段
查询时需要按字段查询,例如 title:电脑, 可以将多个字段的值合并到一个字段进行查询,默认查询字段 text
将 title 和 sellPoint 复制到 text 字段
15.Data Import Handler 配置
添加 jar 文件
Data Import Handler 的 jar 文件存放在 solr目录/dist 目录下
solr-dataimporthandler-8.1.1.jar
solr-dataimporthandler-extras-8.1.1.jar
solr-dataimporthandler-8.1.1.jar
solr-dataimporthandler-extras-8.1.1.jar
复制这两个文件和 mysql 的 jar 文件到 solr目录/server/solr-webapp/webapp/WEB-INF/lib
dih-config.xml
修改 mysql 的 ip 地址,传到
solr目录/server/solr/pd/conf
solrconfig.xml 中添加 DIH 配置
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">dih-config.xml</str>
</lst>
</requestHandler>
16.重启 solr
cd /usr/local/solr-8.1.1
bin/solr restart -force
17.导入数据
18.查询测试
在复制字段 text 中查找 电脑
1.application.yml 添加 solr 连接信息
spring:
data:
solr: #注意修改ip地址
host: http://192.168.64.170:8983/solr/pd
2.商品检索调用分析
3.pom.xml 添加 solr 和 lombok 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
4.Item 实体类
package com.pd.pojo; import java.io.Serializable; import org.apache.solr.client.solrj.beans.Field; import lombok.Data; @Data public class Item implements Serializable { private static final long serialVersionUID = 1L; @Field("id") private String id; @Field("title") private String title; @Field("sellPoint") private String sellPoint; @Field("price") private Long price; @Field("image") private String image; }
5.SearchService 业务接口
package com.pd.service;
import java.util.List;
import com.pd.pojo.Item;
public interface SearchService {
List<Item> findItemByKey(String key) throws Exception;
}
6.SearchServiceImpl 业务实现类
package com.pd.service.impl; import java.util.List; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.response.QueryResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Service; import com.pd.pojo.Item; import com.pd.service.SearchService; @Service public class SearchServiceImpl implements SearchService { /* * SolrClient实例是在 SolrAutoConfiguration 类中创建的 * * SolrAutoConfiguration添加了@Configuration注解, * 是spring boot自动配置类,其中的solrClient()方法中创建了SolrClient实例 */ @Autowired private SolrClient solrClient; @Override public List<Item> findItemByKey(String key) throws Exception { //封装查询的关键词 //也可以封装其他的查询参数,比如指定字段,facet设置等 SolrQuery query = new SolrQuery(key); //查询前多少条数据 query.setStart(0); query.setRows(20); //执行查询并得到查询结果 QueryResponse qr = solrClient.query(query); //把查询结果转成一组商品实例 List<Item> beans = qr.getBeans(Item.class); return beans; } }
7.SearchController 控制器
package com.pd.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import com.pd.pojo.Item; import com.pd.service.SearchService; @Controller public class SearchController { @Autowired private SearchService searchService; @GetMapping("/search/toSearch.html") public String search(String key, Model model) throws Exception { List<Item> itemList = searchService.findItemByKey(key); model.addAttribute("list", itemList); return "/search.jsp"; } }
1.Solr是什么?
Solr 是个可扩展的 (官方有很多功能) 搜索/存储引擎(可以当作数据库使用)
虽然数据库本身有搜索功能, 但只能通过模糊查询,效率非常慢(因为要查询整个数据库). 而 Solr 是基lecene,使用倒排索引, 搜索效率很高;
2.同类型技术比较
3.大概介绍solr的使用
3.1服务端:
1.添加jar包
ik-analyzer-8.1.0.jar------------IK分词器
mysql-connector-java-5.1.46.jar -----------连接数据库
solr-dataimporthandler-8.1.1.jar-------------------数据导入控制器
2.配置scheme.xml文件 -----添加分词器
#修改 solr目录/server/solr/pd/conf/managed-schema,添加 ik-analyzer 分词器
<!-- ik分词器 -->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
3.2客户端:
springBoot整合了solr
服务端负责配置
客户端负责使用
项目里用solr完成了商品的搜索,分页查询
@Service public class SearchServiceImpl implements SearchService { /* * SolrClient实例是在 SolrAutoConfiguration 类中创建的 * * SolrAutoConfiguration添加了@Configuration注解, * 是spring boot自动配置类,其中的solrClient()方法中创建了SolrClient实例 */ @Autowired private SolrClient solrClient; @Override public List<Item> findItemByKey(String key) throws Exception { //封装查询的关键词 //也可以封装其他的查询参数,比如指定字段,facet设置等 SolrQuery query = new SolrQuery(key); //查询前多少条数据 query.setStart(0); query.setRows(20); //执行查询并得到查询结果 QueryResponse qr = solrClient.query(query); //把查询结果转成一组商品实例 List<Item> beans = qr.getBeans(Item.class); return beans; } }
定时更新:
假设我上一次更新的时间是2019.12.02,那我下次增量更新就得拿这个时间,这个时间是存在solr_home\collectionA\conf\dataimport.properties文件内的last_index_time属性的,拿这个时间去数据库 跟 这个标注时间的字段进行比较,在上一次更新时间之后的数据,全都是本次进行增量更新的数据,
<dataConfig>
<dataSource name="solrDB" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.1.10:3306/localdb" user="admin" password="123456" />
<document>
<entity pk="id" dataSource="solrDB" name="z_solr_test" query="select id, name, content, update_time from z_solr_test"
deltaImportQuery="select id, name, content, update_time from z_solr_test where id='${dih.delta.id}'"
deltaQuery="SELECT id, name, content, update_time FROM z_solr_test where update_time >'${dataimporter.last_index_time}'">
<field column="id" name="id" />
<field column="name" name="name" />
<field column="content" name="content" />
<field column="update_time" name="update_time"/>
</entity>
</document>
</dataConfig>
# schedule interval
# number of minutes between two runs
# [defaults to 30 if empty]
#这里是设置定时任务的,单位是分钟,也就是多长时间你检测一次数据同步,根据项目需求修改
# 开始测试的时候为了方便看到效果,时间可以设置短一点
interval=1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。