solr安装配置以及使用数据库同步数据至solr引擎
本文目录
文章目录
一、solr简介
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。
用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器。
同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
工
二、安装环境以及版本
solr是java开发的,安装solr需要有jdk,
使用Tomcat部署,需要安装Tomcat
软件 | 版本 |
---|---|
jdk | 1.8 |
solr | 4.10.3 |
tomcat | 8.5.7 |
三、安装JDK
略(傻瓜式安装)
四、安装tomcat
- 新建文件夹solr_my2
- 复制一个tomcat到该目录下
- 解压
tar -zxvf apache-tomcat-8.5.70\ (1).tar.gz
- 启动测试下(注意由于没有修改端口,使用的是8080,如有冲突,请自行百度修改tomcat的端口)
- 成功启动
五、安装solr
-
安装包可以百度
-
解压
tar -zxvf solr-4.10.3.tgz.tgz
PS(我没使用):进入solr-4.10.3/example目录有start.jar,可以使用java -jar
start.jar启动内置的jetty服务器,从而启动solr服务
把solr部署到Tomcat
- 停止之前运行的Tomcat
- 删除Tomcat的webapps文件夹所有文件,并创建solr文件夹
- 复制solr解压目录的solr.war到Tomcat中
- 解压solr.war
- 删除war包
- 把solr-4.10.3/example/lib/ext目录下的所有的jar包,添加到solr工程中
[root@ithouse-01 ROOT]# cd /usr/local/solr_my2/solr-4.10.3/example/lib/ext/
[root@ithouse-01 ext]# cp * /usr/local/solr_my2/apache-tomcat-8.5.70/webapps/solr/WEB-INF/lib/
- 加入配置文件到solr工程中
注:只有一个log4j文件,classes文件夹是自己创建的
[root@ithouse-01 ext]# cd /usr/local/solr/solr-4.10.3/example/resources/
[root@ithouse-01 resources]# cp * /usr/local/solr/apache-tomcat-8.5.70/webapps/solr/WEB-INF/classes/
- 创建solrhome
/example/solr目录就是一个solrhome。复制此目录到/usr/local/solr/solrhome
- 关联solr及solrhome
需要修改solr工程的web.xml文件
- 删除注释
- 修改第43行,指定solrhome地址(42行的solr/home是固定写法,不能修改)
- 启动tomcat
[root@ithouse-01 example]# /usr/local/solr_my2/apache-tomcat-8.5.70/bin/startup.sh
- solr安装成功
六、配置中文分词器
搜索商品标题需要中文分词,需要配置中文分词器IK
- 停止tomcat
[root@ithouse-01 example]# /usr/local/solr_my2/apache-tomcat-8.5.70/bin/shutdown.sh
- 上传中文分词器jar包
- 复制IKAnalyzer的配置文件和自定义词典和停用词词典到Tomcat服务
- 内容大致如下
- IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic;</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopword.dic;</entry>
</properties>
- 配置schema.xml文件
<!-- IKAnalyzer-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<!--IKAnalyzer Field-->
<field name="content_ik" type="text_ik" indexed="true" stored="true" />
- 重启tomcat生效(可以先不启动)
七、配置业务域
- 根据数据库的表的字段来书写字段名,以及类型
- 重新启动tomcat
八、springboot项目(maven也行)使用solr
- 创建一个maven项目,或者springboot项目,然后导入jar包,以及数据库驱动jar
- 创建一个测试类
package cn.solr;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
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.apache.solr.common.SolrInputDocument;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class SolrAction {
public static void main(String[] args) {
querySolr();
}
//solr地址
private static String solrUlr="http://172.16.248.201:8080/solr";
/*增 从数据库中查询数据插入到solr引擎中*/
public static void addSolr(){
HttpSolrServer httpSolrServer=new HttpSolrServer(solrUlr);
List<SolrInputDocument> listSolr=new ArrayList<>();
try {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost/ebuy?useUnicode=true&characterEncoding=utf-8";
Connection connection= DriverManager.getConnection(url,"root","123");
String sql="select * from easybuy_product";
PreparedStatement ps=connection.prepareStatement(sql);
ResultSet rs=ps.executeQuery();
while (rs.next()){
SolrInputDocument solrInputDocument=new SolrInputDocument();
solrInputDocument.addField("id",rs.getString("ep_id"));
solrInputDocument.addField("ep_name",rs.getString("ep_name"));
solrInputDocument.addField("ep_price",rs.getLong("ep_price"));
solrInputDocument.addField("ep_image",rs.getString("ep_file_name"));
solrInputDocument.addField("epc_id",rs.getLong("epc_id"));
listSolr.add(solrInputDocument);
}
rs.close();
ps.close();
connection.close();
}catch (Exception e){
e.printStackTrace();
}
try {
httpSolrServer.add(listSolr);
httpSolrServer.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/*删 删除solr引擎库中指定、全部的数据*/
public static void delSolr(){
HttpSolrServer httpSolrServer=new HttpSolrServer(solrUlr);
//1.根据主键id删除
try {
httpSolrServer.deleteById("1172680");
httpSolrServer.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//2.根据指定字段指定值删除
// try {
// httpSolrServer.deleteByQuery("ep_name:锤子");
// httpSolrServer.commit();
// } catch (SolrServerException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// }
//3.删除全部数据
// try {
// httpSolrServer.deleteByQuery("*:*");
// httpSolrServer.commit();
// } catch (SolrServerException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// }
}
/*查 查询solr引擎库中的指定条件的数据*/
public static void querySolr(){
HttpSolrServer httpSolrServer=new HttpSolrServer(solrUlr);
//创建solr的query对象
SolrQuery solrQuery=new SolrQuery();
//设置查询条件
solrQuery.setQuery("ep_name:华为");
//设置起始数据位置
solrQuery.setStart(0);
//设置查询的条数
solrQuery.setRows(10);
//设置高亮
solrQuery.setHighlight(true);//开启高亮
solrQuery.addHighlightField("ep_name");//指定高亮增强的solr字段
//设置高亮增强的样式
solrQuery.setHighlightSimplePre("<font color=\"red\">");
solrQuery.setHighlightSimplePost("</font>");
//查询数据
QueryResponse queryResponse=null;
try {
queryResponse= httpSolrServer.query(solrQuery);
//拿到查询结果集
SolrDocumentList results= queryResponse.getResults();
// System.out.println(results);
System.out.println("搜索回来的条数为"+results.getNumFound());
Map<String, Map<String, List<String>>> map= queryResponse.getHighlighting();
System.out.println(map);
// 解析查询结果
for (SolrDocument solrDocument : results) {
System.out.println("----------------------------------------------------");
System.out.println(solrDocument);
// 获取高亮数据
List<String> list = map.get(solrDocument.get("id")).get("ep_name");
// 显示高亮
if (list != null && list.size() > 0) {
System.out.println("商品名称1:" + list.get(0));
} else {
System.out.println("商品名称2:" + solrDocument.get("ep_name"));
}
System.out.println(solrDocument.get("id"));
System.out.println(solrDocument.get("ep_price"));
System.out.println(solrDocument.get("ep_image"));
}
}catch (Exception e){
e.printStackTrace();
}
}
}
- 查询详解
- 至此便是结束了!!!