最近因为毕设需要接触到全文搜索引擎的问题,所以接触到了Elasticsearch以及Solr,但是由于在实习时使用过Solr,所以还是选择熟悉的Solr作为该功能的支持。
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
Solr在过往的版本更新中,以Solr5和Solr4为一个重要的区分点。Solr5以前的启动都是以tomcat作为容器,但是从Solr5开始其内部集成了jetty服务器,使得用户可以直接通过bin目录中的启动文件部署Solr。相对于Solr5之前的版本来说,Solr5及其后续版本均可以独立的应用发布。
话不多说我们直接开始基于Centos7服务器上Solr环境的搭建。因为楼主懒得每次都单独启动,所以还是选择了老办法把Solr部署到tomcat中。
准备工作
1、确认服务器上是否已经安装java,可以用java -version查看,如果显示类似于下图的话,那就有了。没有的话就随手装一个吧
java -version
2、进入到/opt文件夹下(个人偏爱在opt下放东西),下载tomcat以及solr的安装包
wget https://mirrors.cnnic.cn/apache/tomcat/tomcat-9/v9.0.16/bin/apache-tomcat-9.0.16.tar.gz
wget http://mirrors.shuosc.org/apache/lucene/solr/7.7.0/solr-7.7.0.tgz
3、解压文件
tar -zxvf apache-tomcat-9.0.16.tar.gz
tar -zxvf solr-7.7.0.tgz
4、重命名tomcat以及solr
mv apache-tomcat-9.0.16 tomcat9
mv solr-7.7.0 solr7
5、启动tomcat,测试是否可用
/opt/tomcat9/bin/startup.sh
curl localhost:8080
只要返回类似下图的页面就可以了
6、将solr7/server/solr-webapp里面的webapp拷贝到tomcat 的webapps下,重命名为solr
cp -r /opt/solr7/server/solr-webapp/webapp /opt/tomcat9/webapps/
cd /opt/tomcat9/webapps
mv webapp solr
7、将/opt/solr7/server/lib/ext 下的jar包以及lib目录下gmetric4j-1.0.7.jar,以metrics开头的jar包拷贝到 /opt/tomcat9/webapps/solr/WEB-INF/lib下
cd /opt/solr7/server/lib/ext/
cp * /opt/tomcat9/webapps/solr/WEB-INF/lib/
cd ..
cp gmetric4j-1.0.7.jar metrics-* /opt/tomcat9/webapps/solr/WEB-INF/lib/
8、复制/opt/solr7/server下的solr文件夹到任意非中文的目录下(建议不要放在tomcat文件夹下),重命名为solrhome
cd /opt/solr7/server/
cp -r solr /opt/
cd /opt/
mv solr solrhome
9、修改位于/opt/tomcat9/webapps/solr/WEB-INF/目录下的web.xml文件,将下图的中的env-entry-value的值改为自己的solrhome的路径,同时将
10、检查/opt/tomcat9/webapps/solr/WEB-INF下的classes文件夹是否存在,不存在则新建一个。然后将/opt/solr7/server/resources下的log4j.xml复制到新建的classes文件夹中
mkdir -p /opt/tomcat9/webapps/solr/WEB-INF/classes
cp /opt.solr7/server/resources/log4j.xml /opt/tomcat9/webapps/solr/WEB-INF/classes/
11、启动tomcat,测试是否能够访问
用tail -100f /opt/tomcat9/logs/catalina.out查看启动日志
看到日志中有Solr标志就证明启动成功了
curl localhost:8080/solr/index.html
打开浏览器访问可以看到以下画面
12、再页面中找到Core Admin,点击Add Core,这一步会出错,但是在/opt/solrhome/中仍然会创建test目录
解决办法:将/opt/solr7/server/solr/configsets/_default/conf复制到/opt/solrhome/test/下
cp -r /opt/solr7/server/solr/configsets/_default/conf /opt/solrhome/test/
复制后再次点击Add Core会显示成功。
13、配置IK中文分词器
复制/opt/solr7/dist/solr-dataimporthandler-7.2.1.jar到/opt/tomcat9/webapps/solr/WEB-INF/lib文件夹下
复制/opt/solr7/contrib//analysis-extras/lucene-libs/* 到/opt/tomcat9/webapps/solr/WEB-INF/lib文件夹下
cp /opt/solr7/dist/solr-dataimporthandler-7.2.1.jar /opt/tomcat9/webapps/solr/WEB-INF/lib/
cp /opt/solr7/contrib//analysis-extras/lucene-libs/* /opt/tomcat9/webapps/solr/WEB-INF/lib/
14、修改/opt/solrhome/test/conf/managed-schema
vi /opt/solrhome/test/conf/managed-schema
重启tomcat,在页面中可以发现新增的自定义域以及分词效果
分词前
分词后
到此为止安装配置就结束啦,但是有一个配置尚未完成,后续例子再做说明
1、导入依赖
org.springframework.boot
spring-boot-starter-data-solr
2、在application.properties中增加
spring.data.solr.host=http://xxx.xxx.xxx.xxx:8080/solr/manuscript
3、测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class test {
@Autowired
SolrClient solrClient;
@Test
public void test1() throws IOException, SolrServerException {
ContentStreamUpdateRequest up = new ContentStreamUpdateRequest(
"/update/extract");
File file = new File("C:/Users/Administrator/Desktop/test.docx");
up.addFile(file,"application/vnd.openxmlformats-officedocument.wordprocessingml.document");
up.setParam("literal.file_name",file.getName());
up.setParam("literal.file_path",file.getPath());
up.setParam("literal.file_process",file.getName().substring(3));
up.setParam("fmap.content", "file_text");
up.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
solrClient.request(up);
QueryResponse query = solrClient.query(new SolrQuery("*:*"));
SolrDocumentList results = query.getResults();
System.out.println(results);
}
@Test
public void test2() throws IOException, SolrServerException {
QueryResponse query = solrClient.query(new SolrQuery("file_keywords:*"));
SolrDocumentList results = query.getResults();
System.out.println(results);
}
}
4、注意:在测试导入文件进行索引时,会报错:java.lang.ClassNotFoundException:solr.extraction.ExtractingRequestHandler
这是因为Solrhome的core比如test中一些包路径没有配置好
需要增加的一步配置是
vi /opt/solrhome/test/conf/solrconfig.xml
将 lib相关路径改为如下
-
"${solr.install.dir:..}/contrib/extraction/lib" regex=
".*\.jar" />
-
"${solr.install.dir:..}/dist/" regex=
"solr-cell-\d.*\.jar" />
-
"${solr.install.dir:..}/contrib/clustering/lib/" regex=
".*\.jar" />
-
"${solr.install.dir:..}/dist/" regex=
"solr-clustering-\d.*\.jar" />
-
"${solr.install.dir:..}/contrib/langid/lib/" regex=
".*\.jar" />
-
"${solr.install.dir:..}/dist/" regex=
"solr-langid-\d.*\.jar" />
-
"${solr.install.dir:..}/contrib/velocity/lib" regex=
".*\.jar" />
-
"${solr.install.dir:..}/dist/" regex=
"solr-velocity-\d.*\.jar" />
上述的路径中
solr.install.dir也就是core比如test的路径
${solr.install.dir:..}/dist其实就是/opt/solrhome/test/../dist也就是/opt/solrhome/dist
5、配置结束
运行结果就不展示啦