solr笔记
安装jdk
上传jdk安装包到/usr/local/src/java/目录,解压
配置jdk环境变量,vim /etc/profile,添加下面配置
#set java env
JAVA_HOME=/usr/local/src/java/jdk1.8.0_51
JAVA_BIN=/usr/local/src/java/jdk1.8.0_51/bin
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
保存后 source /etc/profile 让配置生效
java -version 查看jdk是否安装好
安装solr
solr各版本下载地址
http://archive.apache.org/dist/lucene/solr/
下载后上传到服务器解压
cd /usr/local/src
# 上传 solr-8.1.1.tgz 到 /usr/local/src 目录
# 并解压缩
tar -xzf solr-8.1.1.tgz
启动solr
cd /usr/local/src/solr-8.1.1 进入solr根目录
bin/solr start -force 启动solr -force 强制启动
开放8983端口
firewall-cmd --zone=public --add-port=8983/tcp --permanent
firewall-cmd --reload 重启防火墙
浏览器访问solr控制台
创建core
数据库中 item表中的商品数据, 在 solr 中保存索引数据, 一类数据, 在 solr 中创建一个 core 保存索引数据
创建一个名为tt的core,首先要有以下目录结构
solr目录/server/solr/
tt/
conf/
data/
cd server/solr
mkdir tt tt/conf tt/data 在solr目录/server/solr 创建tt目录,在tt目录分别创建conf和data目录
conf 目录是 core 的配置目录, 存储一组配置文件, 我们以默认配置为基础, 后续逐步修改
复制默认配置
cd /usr/local/src/solr-8.1.1/
cp -r server/solr/configsets/_default/conf server/solr/tt
创建名为tt的core
中文分词工具 - ik-analyzer
将下面4个jar包传到/server/solr-webapp/webapp/WEB-INF/lib目录下
ik-analyzer-8.1.0.jar ik分词器的jar包
mysql-connector-java-5.1.46.jar mysql的jar包
solr-dataimporthandler-8.1.1.jar
solr-dataimporthandler-extras-8.1.1.jar 下面两个是DIH的jar包,待会要用到
把下面3个文件上传到/server/solr-webapp/webapp/WEB-INF/classes下,如classes目录不存在,则创建该目录
IKAnalyzer.cfg.xml ik分词器的扩展配置文件,指定下面两个文件的配置地址
stopword.dic 停止词词典
ext.dic 扩展词词典
dynamicdic.txt 动态词词典
ik.conf
配置managed-schema
修改 solr目录/server/solr/tt/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>
重启solr服务
cd /usr/local/src/solr-8.1.1
bin/solr restart -force
添加字段Field
可以在添加ik分词器的文件managed-schema里直接添加如下:
<field name="title" type="text_ik" indexed="true" stored="true"/>
<field name="sellPoint" type="text_ik" indexed="true" stored="true"/>
<field name="price" type="long" indexed="true" stored="true"/>
<field name="num" type="int" indexed="true" stored="true"/>
<field name="image" type="string" indexed="false" stored="true" multiValued="true"/>
<field name="created" type="date" indexed="true" stored="true"/>
<field name="updated" type="date" indexed="true" stored="true"/>
也可以用浏览器在solr控制台上添加如下:
Copy Field 副本字段
查询时需要按字段查询,例如 title:电脑, 可以将多个字段的值合并到一个字段进行查询,默认查询字段 _text_
将 title 和 sellPoint 复制到 _text_ 字段
Data Import Handler 配置
将数据库的数据导入到solr
需要添加的jar包在上面提前导入过
将dih-config.xml文件传到/server/solr/tt/conf目录下,这个文件配置了从数据库导入solr的相关配置,dih-config.xml文件如下:
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://ip:3306/databaseName"
user="root"
password="root"
batchSize="100"
autoCommit="false" />
<document name="item">
<entity name="item" pk="id"
query="SELECT id,title,sell_point,price,num,barcode,image,cid,`status`,created,updated FROM tableName"
deltaQuery="SELECT id,title,sell_point,price,num,barcode,image,cid,`status`,created,updated FROM tableName WHERE updated > date_add(str_to_date('${dih.last_index_time}','%Y-%m-%d %H:%i:%s'),interval 8 hour)"
transformer="RegexTransformer">
</entity>
</document>
</dataConfig>
dataSource是配置数据源,从数据库导入数据
document里的query是查询数据导入solr,deltaQuery是设置每隔8小时把数据中最新的数据导入solr中
修改solrconfig.xml文件,添加dih-config.xml
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">dih-config.xml</str>
</lst>
</requestHandler>
重启solr
cd /usr/local/src/solr-8.1.1
bin/solr restart -force
导入mysql数据
测试查询
项目实现全文检索
pom文件添加solr依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
application.yml文件添加solr配置信息
spring:
data:
solr: #注意修改ip地址
host: http://ip:8983/solr/tt
新建SearchService接口
public interface SearchService {
List<Item> findItemByKey(String key) throws Exception;
}
新建SearchServiceImpl业务实现类
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> itemList= qr.getBeans(Item.class);
return itemList;
}
}
ContollerSearch控制器
@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";
}
}