一甜奄、簡介
搜索是項(xiàng)目中常用的功能哼丈,對于大數(shù)據(jù)量的搜索,查詢關(guān)系型數(shù)據(jù)庫是非常低效的靶擦,好在有三方專門用于搜索的工具,常用的搜索解決方案為:
- 基于Apache Lucene實(shí)現(xiàn)
- 基于百度API實(shí)現(xiàn)
- 基于谷歌API實(shí)現(xiàn)
solr基于Lucene實(shí)現(xiàn)雇毫,本質(zhì)是一個(gè)Java Web項(xiàng)目奢啥,并集成了Jetty服務(wù)器,Jetty和Tomcat差不多嘴拢,也是一個(gè)JavaWeb容器,我們客戶端只需要通過調(diào)用solr控制器寂纪,solr處理完后返回?cái)?shù)據(jù)
反向索引
搜索使用反向索引
將大大提高搜索效率席吴,正向索引與反向索引的區(qū)別如下:
- 正向索引:將查找內(nèi)容分詞赌结,后根據(jù)分詞完的詞組,挨個(gè)進(jìn)行搜索:
- 反向索引:內(nèi)容存入數(shù)據(jù)源的同時(shí)進(jìn)行分詞孝冒,搜索時(shí)直接根據(jù)詞組搜索:
solr搜索原理
solr就是利用了反向索引柬姚,將搜索內(nèi)容分詞后,直接和存儲內(nèi)容的索引進(jìn)行匹配:
solr擁有自己的數(shù)據(jù)庫庄涡,以Document
作存儲
二量承、solr安裝
前面提到過solr是Java Web
項(xiàng)目,所以需要先裝好JDK
官網(wǎng)下載:https://solr.apache.org/downloads.html
1. 解壓
下載傳入服務(wù)器后穴店,解壓:
tar xvf solr-8.11.2.tgz
2. 移動
移動到/usr/local
目錄下:
mv ./solr-8.11.2 /usr/local/
3. 修改啟動參數(shù)
cd /usr/local/solr-8.11.2/bin/
vi solr.in.sh
找到SOLR_ULIMIT_CHECKS
并修改:
SOLR_ULIMIT_CHECKS=false
4. 啟動solr
如果是root
用戶撕捍,需要加上-force
./solr start -force
啟動成功:
三、可視化管理界面
訪問服務(wù)器8983端口可以進(jìn)入solr的可視化管理界面:
- 整體信息
- 日志
- 安全性相關(guān)
- 核心泣洞。類似數(shù)據(jù)庫DataBase
- Java信息
- 線程相關(guān)
- 如果有核心忧风,將在此處顯示
四、創(chuàng)建核心
solr安裝完后球凰,直接在界面上添加核心會報(bào)錯狮腿,需要進(jìn)行一些配置
1. 復(fù)制配置文件
cd /usr/local/solr-8.11.2/server/solr
mkdir test_core
cp -r configsets/_default/conf/ test_core/
2. 創(chuàng)建核心
instanceDir
需要和上面創(chuàng)建的文件夾名一致,確認(rèn)信息后呕诉,點(diǎn)擊Add Core
:
等待創(chuàng)建結(jié)束后缘厢,下方就可以選擇核心了:
四、中文分詞配置
solr默認(rèn)對中文只會按照每個(gè)字進(jìn)行分詞:
如果想要獲得中文較好的支持甩挫,需要使用ik-analyzer.jar
包贴硫,下載地址:https://search.maven.org/search?q=com.github.magese,注意對應(yīng)solr大版本
1. 導(dǎo)入jar
將下載完后傳入服務(wù)器捶闸,并移動到/usr/local/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib
目錄下:
mv ik-analyzer-8.5.0.jar /usr/local/solr-8.11.2/server/solr-webapp/webapp/libs/
2. 修改配置文件
上面提到solr使用Document存儲夜畴,Document包含的屬性和屬性類型都定義在managed-schemel
中,爭對中文的分詞删壮,我們需要自定義一個(gè)屬性并賦予它類型
編輯對應(yīng)核心的managed-schemel
文件贪绘,/usr/local/solr-8.11.2/server/solr/test_core/conf
目錄下:
cd /usr/local/solr-8.11.2/server/solr/test_core/conf
vi managed-schema
2.1 添加屬性
在schema標(biāo)簽
包裹區(qū)域內(nèi)添加:
<!--定義屬性,type表示屬性類型 indexed表示是否建立索引 stored表示是否顯示給用戶-->
<field name="_china_" type="text_ik" indexed="true" stored="true" />
2.2 添加屬性類型
和剛剛導(dǎo)入的jar
包進(jìn)行關(guān)聯(lián):
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
3. 重啟solr
cd /usr/local/solr-8.11.2/bin
./solr stop -all
./solr start -force
在界面上使用_china_
進(jìn)行分詞:
4. managed-schema說明
標(biāo)簽 | 屬性 | 描述 |
---|---|---|
< fieldType/> | 定義屬性類型 | |
< field/> | 定義屬性 | |
name | 屬性名稱 | |
type | 屬性的類型 | |
indexed | 該屬性是否建立索引央碟,即可以通過分詞的詞組被查找 | |
stored | 該屬性是否需要返回給搜索用戶税灌,并不是所有屬性都要展示 | |
required | 該屬性是否必須 | |
multiValued | 該屬性是否為復(fù)合屬性,即屬性中還有其他屬性 | |
< copyField/> | 與multiValued 搭配使用亿虽,用于表示符合屬性中使用的多個(gè)屬性 |
|
source | 指定關(guān)聯(lián)的屬性名 | |
dest | 指定復(fù)合屬性名 | |
< uniqueKey/> | 唯一主鍵屬性 | |
< dynamicField/> | 定義動態(tài)屬性菱涤,name通過通配符進(jìn)行配置,可以表示多個(gè)屬性 |
五洛勉、DataImport
接著我們將本地?cái)?shù)據(jù)庫中的數(shù)據(jù)導(dǎo)入到solr中粘秆,使用的是solr的dataimport
,將dept
部門表數(shù)據(jù)導(dǎo)入收毫,SQL的創(chuàng)建在MyBatis--初入MyBatis中可以找到
1. 準(zhǔn)備屬性
在managed-schema
中定義與本地?cái)?shù)據(jù)庫字段相對應(yīng)的屬性:
cd /usr/local/solr-8.11.2/server/solr/test_core/conf
vi managed-schema
默認(rèn)的一些屬性類型可以在界面中查找:
部門表對應(yīng)的屬性:
<field name="deptno" type="pint" indexed="false" stored="true"/>
<field name="dname" type="text_general" indexed="true" stored="true"/>
<field name="loc" type="text_ik" indexed="true" stored="true"/>
2. 新建配置文件
在同一個(gè)目錄下新建配置文件攻走,用于連接數(shù)據(jù)庫以及做數(shù)據(jù)庫字段和屬性的映射:
vi data-dept.xml
內(nèi)容為:
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.42.170:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&tinyInt1isBit=false"
user="root"
password="root"/>
<document>
<entity name="dept" query="select * from dept">
<!--
實(shí)現(xiàn)數(shù)據(jù)庫的列和索引庫的字段的映射
column 指定數(shù)據(jù)庫的列表
name 指定索引庫的字段名字殷勘,必須和managed-schema中定義的一樣
-->
<field column="deptno" name="deptno"/>
<field column="dname" name="dname"/>
<field column="loc" name="loc"/>
</entity>
</document>
</dataConfig>
3. 配置solrconfig.xml
vi solrconfig.xml
在config標(biāo)簽
包裹中添加DataImport的使用:
<!-- 配置數(shù)據(jù)導(dǎo)入的處理器 -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<!-- 加載data-dept.xml -->
<str name="config">data-dept.xml</str>
</lst>
</requestHandler>
4. 導(dǎo)入jar包
還需要將兩個(gè)jar包導(dǎo)入到\WEB-INF\lib
目錄中:
cd /usr/local/solr-8.11.2/dist
cp solr-dataimporthandler-* /usr/local/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib
以及mysql
的數(shù)據(jù)庫驅(qū)動,下載后上傳到服務(wù)器昔搂,再移動到\WEB-INF\lib
目錄中:
cp mysql-connector-java-8.0.29.jar /usr/local/solr-8.11.2/server/solr-webapp/webapp/WEB-INF/lib
5. 重啟solr并導(dǎo)入數(shù)據(jù)
cd /usr/local/solr-8.11.2/
./solr stop -all
./solr start -force
界面上點(diǎn)擊執(zhí)行:
如果出錯玲销,可以查看/usr/local/solr-8.11.2/server/logs/solr.log
的日志:
tail -f solr.log
我這邊遇到的是mysql連接不上,修改mysql的user表
摘符,將root用戶
的Host
改為%
:
查詢下數(shù)據(jù)贤斜,發(fā)現(xiàn)已經(jīng)導(dǎo)入了:
六、solr集群搭建
solr內(nèi)置了集群功能逛裤,是基于zookeeper實(shí)現(xiàn)的瘩绒,啟動集群非常便利
1. 開啟集群
執(zhí)行開啟集群命令,可以使用-noprompt表示默認(rèn)配置:
./solr -e cloud [-noprompt] -force
完成后别凹,會創(chuàng)建兩個(gè)node目錄:
2. 重啟
./solr start -c -p 8983 -s ../example/cloud/node1/solr/ -force
./solr start -c -p 7574 -z localhost:9983 -s ../example/cloud/node2/solr/ -force