本文爲轉載 ,放便自己和他人日後使用 , 原文地址:https://blog.csdn.net/xh_small_black/article/details/87968394
最近因爲畢設需要接觸到全文搜索引擎的問題,所以接觸到了Elasticsearch以及Solr,但是由於在實習時使用過Solr,所以還是選擇熟悉的Solr作爲該功能的支持。
二、Solr簡介
Solr是一個獨立的企業級搜索應用服務器,它對外提供類似於Web-service的API接口。用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,並得到XML格式的返回結果。
三、Solr環境搭建
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的路徑,同時將<security-constraint>部分註釋掉
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
<fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
</fieldType>
<field name="file_name" type="text_ik" indexed="true" stored="true"/>
<field name="file_path" type="text_ik" indexed="true" stored="true"/>
<field name="file_text" type="text_ik" indexed="true" stored="true"/>
<field name="file_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="file_name" dest="file_keywords"/>
<copyField source="file_path" dest="file_keywords"/>
<copyField source="file_text" dest="file_keywords"/>
重啓tomcat,在頁面中可以發現新增的自定義域以及分詞效果
分詞前
分詞後
到此爲止安裝配置就結束啦,但是有一個配置尚未完成,後續例子再做說明
四、Springboot整合
1、導入依賴
<!--集成solr搜索引擎客戶端-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
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相關路徑改爲如下
- <lib dir="${solr.install.dir:..}/contrib/extraction/lib" regex=".*\.jar" />
- <lib dir="${solr.install.dir:..}/dist/" regex="solr-cell-\d.*\.jar" />
- <lib dir="${solr.install.dir:..}/contrib/clustering/lib/" regex=".*\.jar" />
- <lib dir="${solr.install.dir:..}/dist/" regex="solr-clustering-\d.*\.jar" />
- <lib dir="${solr.install.dir:..}/contrib/langid/lib/" regex=".*\.jar" />
- <lib dir="${solr.install.dir:..}/dist/" regex="solr-langid-\d.*\.jar" />
- <lib dir="${solr.install.dir:..}/contrib/velocity/lib" regex=".*\.jar" />
- <lib dir="${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、配置結束
運行結果就不展示啦