solr應用入門例項
教程網址:https://blog.csdn.net/liaomin416100569/article/details/77301756
一 、solr簡介
solr是以lucene為核心開發的企業級搜尋應用 應用程式可以通過http請求方式來提交索引,查詢索引,提供了比lucene更豐富的查詢語言,是
一個高效能,高可用環境全文搜尋引擎
二、核與文件的概念
核(core):是用於儲存json格式的資料,等價於mysql中資料庫的概念
文件:一個json物件就是一個文件 相同屬性的json陣列集合就是一個表
三、使用dokcer安裝solr安裝
這裡下載 solr-5.5.5的映象
[[email protected] ~]# docker pull solr:5.5.5
建立一個名為 my_solr1 的的容器
[[email protected] ~]# docker run --name my_solr1 -id --net host -t solr:5.5.5
在 my_solr1
[[email protected] ~]# docker exec -it --user=solr my_solr1 bin/solr create_core -c mycore
建立完成後有以下提示
解釋:
--user=solr:表示用solr這個賬號去執行這個命令(solr是預設使用者)
create_core -c mycore:建立一個名字是mycore的核(也可以認為是資料庫的名字)
檢視網頁:ip:8983/solr/
ip:指linux系統的ip
Documents:表示在裡面新增一些json資料
Query:表示查詢,在沒有分詞的情況下相當於資料庫裡面的:鍵=值(全文字匹配)
四、配置中文分詞器
預設solr 沒有使用中文分詞器 所有搜尋的詞 都是整個句子就是一個詞 搜尋時 將單詞全部寫入才能搜尋或者使用* 需要配置中文分詞器目前比較好用的分詞器 是IK 2012年停更 只支援到 Lucene4.7 所有 solr5.5 需要lucene5支援 需要修改部分原始碼來支援solr5.5
開啟開發者工具,建立一個maven專案
匯入依賴
<!-- 將4.7.2的版本剔除,新增5.5.5版本的依賴 -->
<dependencies>
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
<exclusions>
<exclusion>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>5.5.5</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>5.5.5</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>5.5.5</version>
</dependency>
</dependencies>
重寫 org.wltea.analyzer.lucene 包下的 IKTokenizer 類與 IKAnalyzer 類
將重寫的兩個類進行修改
IKAnalyzer.java
IKTokenizer.java
將ikanalyzer-2012_u6.jar包複製出來,並將重新編譯好的IKAnalyzer.class和IKTokenizer.class複製進去
進入linux系統,將jar包複製到my_solr1容器的 /opt/solr/server/solr-webapp/webapp/WEB-INF/lib 目錄下
1.建立一個/opt/ika目錄
[[email protected] ~]# cd /opt/ika
2.使用rz命令將jar包匯入到linux系統 (沒有rz命令的自己上網去查,這裡就不解釋了)
[[email protected] ika]# rz
3.將jar包匯入my_solr1容器的 /opt/solr/server/solr-webapp/webapp/WEB-INF/lib 目錄下,然後重新啟動容器
[[email protected] ika]# docker cp ./ikanalyzer-2012_u6.jar my_solr1:/opt/solr/server/solr-webapp/webapp/WEB-INF/lib
[[email protected] ika]# docker stop my_solr
[[email protected] ika]# docker start my_solr
定義分詞器資料型別
1.將容器中的managed-schema配置檔案匯出來進行修改
[[email protected] ika]# docker cp my_solr1:/opt/solr/server/solr/mycore/conf/managed-schema ./
2.在這裡我為了方便直接開啟**Notepad++**進行修改
新增欄位型別
# 新增一個名字是:text_ik的欄位型別
<fieldType name="text_ik" class="solr.TextField" >
# 表示在鍵索引和查詢的時候使用IK分詞器
<analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
新增動態欄位
# 動態欄位
# *_ik:表示將來新增的欄位後面帶有_ik都會用這裡的,而不會自動新增
# text_ik: 表示將來_ik結尾的欄位都會用text_ik欄位型別
# indexed:表示是否分詞
<dynamicField name="*_ik" type="text_ik" indexed="true" stored="true"/>
將來增加欄位和查詢的時候想用分詞,只要在欄位的後面新增_ik就行了
3.將修改好的配置檔案拷貝回容器目錄
[[email protected] ika]# docker stop my_solr1
[[email protected] ika]# docker cp ./managed-schema my_solr1:/opt/solr/server/solr/mycore/conf/
[[email protected] ika]# docker start my_solr1
小知識:如果分詞器配置出錯,在插資料的時候會報錯
模擬分詞查詢
{
"id":"3",
"title_ik":"我愛中國",
"content_ik":"中國地大物博"
}
五、資料庫遷移
假設存在表 solr 表示 其中 有以下資料:
進入solr所在伺服器 搜尋 dataimport相關jar包
[[email protected] ika]# docker exec -it my_solr1 bash
[email protected]:/opt/solr$ find / -name *import*.jar
/opt/solr/dist/solr-dataimporthandler-5.5.5.jar
/opt/solr/dist/solr-dataimporthandler-extras-5.5.5.jar
1.將這兩個jar包拷貝到 solr啟動應用 webapp/lib目錄下
cp /opt/solr/dist/solr-dataimporthandler-5.5.5.jar /opt/solr/server/solr-webapp/webapp/WEB-INF/lib
cp /opt/solr/dist/solr-dataimporthandler-extras-5.5.5.jar /opt/solr/server/solr-webapp/webapp/WEB-INF/lib
2,將mysql的驅動包 丟到該目錄下
網址:https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.14
下載到桌面
使用 rz 命令匯入linux系統裡面
[[email protected] ika]# rz
將mysql包匯入名字是my_solr的solr容器的WEB-INF/lib目錄下
[[email protected] ika]# docker cp ./mysql-connector-java-5.1.14.jar my_solr1:/opt/solr/server/solr-webapp/webapp/WEB-INF/lib
3.增加一個data-mysql.xml檔案(配置連線的資料庫以及查詢的sql語句 ),這裡我也拿Notepad++寫了
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource name="source1" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.0.243:3306/m1dn" user="root" password="ps123456" batchSize="-1" />
<document>
<entity name="solr" pk="solr_id" dataSource="source1"
query="select * from solr" >
<field column="solr_id" name="id"/>
<field column="solr_title" name="solr_title_ik"/>
</entity>
</document>
</dataConfig>
4.將data-mysql.xml檔案拷貝到solr容器的/opt/solr/server/solr/mycore/conf目錄下
[[email protected] ika]# docker cp ./data-mysql.xml my_solr1:/opt/solr/server/solr/mycore/conf
5.修改solr容器中的solrconfig.xml檔案 將其指定為data-mysql.xml 檔案
將容器中的solrconfig.xml檔案拷貝出來進行編輯
[[email protected] ika]# docker cp my_solr1:/opt/solr/server/solr/mycore/conf/solrconfig.xml .
注意:最後的 . 表示:當前目錄
開啟notepad++編輯solrconfig.xml檔案指定data-data.xml,新增:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-mysql.xml</str>
</lst>
</requestHandler>
注意:data-mysql.xml是指:你配置資料庫配置的檔名
6.將solrconfig.xml檔案拷貝回solr容器的/opt/solr/server/solr/mycore/conf目錄下
[[email protected] ika]# docker cp ./solrconfig.xml my_solr1:/opt/solr/server/solr/mycore/conf
[[email protected] ika]# docker restart my_solr1
7.檢視效果
提交之後,查詢可能不會出來,重新重新整理一下頁面試試
六、springboot整合solr
1.建立一個專案
2.匯入依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
</dependencies>
3.構建一個實體類
@Data
@SolrDocument(solrCoreName="mycore")
public class SolrFiled {
private String id;
@Field("solr_title_ik")
private String title;
}
4.增加一個main方法
@SpringBootApplication
public class SolrMain {
@Bean
public SolrTemplate solrTemplate(SolrClient client) {
return new SolrTemplate(client);
}
public static void main(String[] args) {
SpringApplication.run(SolrMain.class, args);
}
}
5.建立html介面展示
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
function query(){
$.ajax({
url:'queryList',
dataType:'json',
data:'keyword='+$("#myKey").val(),
type:'get',
success:function(data){
$("#vessel").text(JSON.stringify(data));
}
})
}
</script>
</head>
<body>
新聞:<input id="myKey" type="text" name="keyword"/><button onclick="query()">提交</button>
<div id="vessel"></div>
</body>
</html>
6.增加一個配置檔案:application.yml
spring:
data:
solr:
host: http://192.168.115.131:8983/solr
server:
port: 8888
7.建立controller層
@RestController
public class SolrController {
@Autowired
private SolrTemplate solrTemplate;
@GetMapping("/queryList")
public List<SolrFiled> query(String keyword){
SimpleQuery sq = new SimpleQuery("solr_title_ik:"+keyword);
Page<SolrFiled> query = solrTemplate.query(sq, SolrFiled.class);
return query.getContent();
}
}
8.執行main方法與效果展示