solr安装
一. solr的环境: java8的安装
solr基于java, solr 8 以上的版本 需要java8的支持
二. solr的安装和启动
step 1: 获取下载包
镜像云 搜 apache -> lucene -> solr
step2: 下载
cd /opt
wget https://repo.huaweicloud.com/apache/lucene/solr/8.11.2/solr-8.11.2.tgz
Step3: 解压并进入文件目录
tar xf solr-8.11.2.tgz
cd solr-8.11.2
Step5: 启动
solr默认启动端口8983. 注意在云服务器的网页安全组那块 暴露端口号
bin/solr start -force
Step6 - 检查运行状态
bin/solr status
如果运行正常 可以访问页面 http://localhost:8983/solr/
其他命令
日志文件位置
三. 导入数据
Step 1 - 创建core
在/opt/solr-8.11.2/server/solr 目录下创建一个文件夹
将来这个文件夹的名字需要和 admin页面创建的core的名称一致
cd /opt/solr-8.11.2/server/solr
mkdir deviceplan
# 然后为了保证核心能创建成功,将以下路径下的conf文件夹拷贝到你所创建的核心文件夹中
cp -rf /opt/solr-8.11.2/server/solr/configsets/sample_techproducts_configs/conf /opt/solr-8.11.2/server/solr/deviceplan/
输入ls deviceplan/conf
如果有许多文件 表明复制成功
接下来登陆SolrAdmin进行创建核心(前提要根据第三步启动solr)
访问:http://localhost:8983/solr 进行addcore
如果没有启动 cd /opt/solr-8.11.2 bin/solr start -force 启动solr
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PwjfQv2A-1688010122531)(solr%E5%AE%89%E8%A3%85%20af2619dd0adb487b999b2dee84c39316/Untitled.png)]
注意:前两个方框里的内容要一致并且名称要和你创建的核心文件夹名称一致
然后点击add core ,核心就创建成功了
到这里solr就已经搭建好了
step 2 - 引入ik分词器
将ik分词器压缩包解压,解压后的文件上传至服务器
链接:
提取码:5hom
此命令需要windows里面执行 在 ik解压缩包所在的目录使用git bash here
scp .\ikanalyzer-solr5.zip fujian:/home/ubuntu
#登录服务器
mv /home/ubuntu/ikanalyzer-solr5.zip /opt
# 解压
cd /opt
unzip ikanalyzer-solr5.zip -d ikanalyzer-solr5
如果没有设置免密登录 ssh1替换为 root@公网ip
然后将解压出来的两个jar包放到以下路径:
/opt/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib
使用如下命令
cp -rf /opt/ikanalyzer-solr5/*.jar /opt/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib
#使用如下命令查看是否复制成功
ls /opt/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib | grep ik
其它的三个文件放到以下路径:
/opt/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/classes
使用命令查看目录下是否存在classes文件夹
cd /opt/solr-8.11.2/server/solr-webapp/webapp/WEB-INF
ls
#如果没有classes文件夹 执行创建下面的这句创建命令
mkdir classes
#将三个文件复制到classes下
cp -f /opt/ikanalyzer-solr5/IKAnalyzer.cfg.xml /opt/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/classes
cp -f /opt/ikanalyzer-solr5/stopword.dic /opt/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/classes
cp -f /opt/ikanalyzer-solr5/ext.dic /opt/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/classes
#查看是否复制成功
ls /opt/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/classes
然后进行ik分词器的配置,编辑以下路径的managed-schema文件
# 进入step 1 中你创建的那个代表core的文件夹
cd /opt/solr-8.11.2/server/solr/deviceplan/conf
vi managed-schema
将以下配置放到文件最后
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
不要越到 schema 标签外
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FGcpF1Ob-1688010122532)(solr%E5%AE%89%E8%A3%85%20af2619dd0adb487b999b2dee84c39316/Untitled%201.png)]
到这里ik中文分词器就配置好了
测试ik分词器
重启solr
cd /opt/solr-8.11.2/
bin/solr restart -force
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WBlgP0jQ-1688010122533)(solr%E5%AE%89%E8%A3%85%20af2619dd0adb487b999b2dee84c39316/Untitled%202.png)]
注意: 如何定制专有名词, 编辑配置文件, 在里面加入的内容会被自动当成一个词汇
:/opt/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/classes/ext.dic
记得改完后重启solr
step 3 - 从数据库导入数据
第一步:导入相关包:
在创建的核心目录下新建lib
文件夹(如果有,无需建立),从Solr包的dist文件夹中导入两个solr-dataimporthandler
包,以及一个mysql
驱动包。
如果没有lib包
cd /opt/solr-8.11.2/server/solr/deviceplan/lib
cp -f /opt/solr-8.11.2/dist/solr-dataimporthandler-8.11.2.jar /opt/solr-8.11.2/server/solr/deviceplan/lib
cp -f /opt/solr-8.11.2/dist/solr-dataimporthandler-extras-8.11.2.jar /opt/solr-8.11.2/server/solr/deviceplan/lib
# ls命令 可以查看到导入的两个包
ls
#下载mysql驱动包
wget https://mirrors.huaweicloud.com/repository/maven/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar
第二步:编辑以下路径中的solrconfig文件(emms为自己所创建的核心文件夹):
cd /opt/solr-8.11.2/server/solr/deviceplan/conf
vi solrconfig.xml
在文件末尾添加以下内容
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
不要越过 /config 标签
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vHyK3qtL-1688010122533)(solr%E5%AE%89%E8%A3%85%20af2619dd0adb487b999b2dee84c39316/Untitled%203.png)]
然后在本目录下的data-config.xml进行如下编辑(没有则创建):
vi data-config.xml
添加如下内容
注意 必须有一个字段的名称为id 这是schema.xml文件中的强制要求
注意: 粘贴xml如果出现了不对齐的情况, :q! 强制退出, 重新编辑
不要按i, 先输入 :set paste 然后再按 i进入插入模式, 然后粘贴
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<!-- db info -->
<dataSource type="JdbcDataSource"
driver="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://112.123.156.213:3306/emms?useUnicode=true&serverTimezone=Hongkong&characterEncoding=UTF-8&tinyInt1isBit=false"
user="root" password="123456"/>
<document>
<!-- document entity -->
<entity name="news" query="select DevPlanID, JctID, DevName ,DevType , DATE_FORMAT(PlanDate , '%Y-%m-%dT%TZ') PlanDate from elec_device_plan;">
<!-- db field map solr field -->
<field column="DevPlanID" name="id"/>
<field column="JctID" name="product_JctID"/>
<field column="DevName" name="product_DevName"/>
<field column="DevType" name="product_DevType"/>
<field column="PlanDate" name="product_PlanDate"/>
</entity>
</document>
</dataConfig>
扩展: mysql中的日期格式的数据存储到solr中, solr中的日期数据格式被强制要求为如下格式: 2022-12-10T00:00:00Z
然后在当前目录的managed-schema文件的末尾加入相应的类型映射
vi managed-schema
扩展: vi在一般模式下 按 shift + g 其实也就是按下大写的g 就会回到文件模块 按下gg 就会回到文件开头
注意: mysql中date对应到solr是pdate, double对应pdouble, long对应plong
<field name="product_JctID" type="string" indexed="true" stored="true" />
<field name="product_DevName" type="text_ik" indexed="true" stored="true" />
<field name="product_DevType" type="string" indexed="true" stored="true" />
<field name="product_PlanDate" type="pdate" indexed="true" stored="true" />
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k5Hf6AnO-1688010122535)(solr%E5%AE%89%E8%A3%85%20af2619dd0adb487b999b2dee84c39316/Untitled%204.png)]
重启 solr
cd /opt/solr-8.11.2
bin/solr restart -force
登陆http://ip:8983/solr/,进入以下模块,执行excute就导入数据了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y31oIaTd-1688010122535)(solr%E5%AE%89%E8%A3%85%20af2619dd0adb487b999b2dee84c39316/Untitled%205.png)]
四. 查询数据
点击左侧栏目的query
common q中的查询语法
*:*
# 字段名称: 字段关键值
但是一次只能在一个字段名称中写 肯定是不方便的
在managed-schema中加入复合字段
vi /opt/solr-8.11.2/server/solr/deviceplan/conf/managed-schema
<field name="product_multi_search" type="text_ik" indexed="true" stored="true" multiValued="true" />
<copyField source="product_DevName" dest="product_multi_search"/>
<copyField source="product_DevType" dest="product_multi_search"/>
注意: multiValued标为true的字段, 是复合字段, 这个字段本身不存在, 他是将别的字段融合到了自己这块
重启solr
bin/solr restart -force
重新点击数据导入
fq添加范围限定
product_price:[10 TO 20]
product_price: 10
Sort
product_price desc
product_price asc
Fl 查询哪些字段
product_catalog, product_catalog_name
日期的范围查询
日期格式必须是: 2022-12-15T00:00:00Z
product_PlanDate:[2022-12-15T00:00:00Z TO 2022-12-17T00:00:00Z]
hl 高亮设置(纯了解性, 前端内容)
#高亮字段
hl.fl
product_multi_search
hl.simple.pre
<em>
hl.simple.post
</em>
java操作solr
添加一个solrj依赖
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>8.11.2</version>
</dependency>
查询测试代码
@Test
public void test1() throws SolrServerException, IOException {
String solrUrl = "http://81.70.199.213:8983/solr/deviceplan";
HttpSolrClient solrClient = new HttpSolrClient.Builder()
.withBaseSolrUrl(solrUrl).build();
//测试能否连接
//SolrPingResponse ping = solrClient.ping();
//System.out.println("ping = " + ping);
//solr替代设备计划表的所有功能
//设备计划 CRUD
//查询
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery("*:*");
solrQuery.setSort("product_PlanDate", SolrQuery.ORDER.desc);
solrQuery.setStart(0);
solrQuery.setRows(2);
QueryResponse queryResponse = solrClient.query(solrQuery);
System.out.println("queryResponse = " + queryResponse);
//可以将查询结果映射到对应的对象中
//solr结果 => java对象
List<ElecDevicePlan> devicePlans = queryResponse.getBeans(ElecDevicePlan.class);
System.out.println("devicePlans = " + devicePlans);
//这个数据相当于 jdbc那块的 resultset
//SolrDocumentList results = queryResponse.getResults();
//for (SolrDocument result : results) {
// Object o = result.get("product_DevName");
// System.out.println("o = " + o);
//}
}
文章评论