1. 程式人生 > >solr應用入門例項

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

容器中使用 solr 賬號建立一個名字是 mycore 的核

[[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_solrsolr容器的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方法與效果展示
在這裡插入圖片描述