1啃擦、簡(jiǎn)介
Solr是apache的頂級(jí)開(kāi)源項(xiàng)目,它是使用java開(kāi)發(fā) 撤缴,基于lucene的全文檢索服務(wù)器刹枉。
Solr比lucene提供了更多的查詢語(yǔ)句,而且它可擴(kuò)展屈呕、可配置微宝,同時(shí)它對(duì)lucene的性能進(jìn)行了優(yōu)化。
Solr是如何實(shí)現(xiàn)全文檢索的呢:
索引流程:solr客戶端(瀏覽器虎眨、java程序)可以向solr服務(wù)端發(fā)送POST請(qǐng)求蟋软,請(qǐng)求內(nèi)容是包含F(xiàn)ield等信息的一個(gè)xml文檔,通過(guò)該文檔嗽桩,solr實(shí)現(xiàn)對(duì)索引的維護(hù)(增刪改)
搜索流程:solr客戶端(瀏覽器遵堵、java程序)可以向solr服務(wù)端發(fā)送GET請(qǐng)求机杜,solr服務(wù)器返回一個(gè)xml文檔极颓。
2霍骄、solr整合tomcat
solr自帶的web容器是jetty,有時(shí)候我們想要使用tomcat替代jetty扑庞,就需要讓solr整合tomcat譬重,本文基于solr8.5與tomcat9,不同的solr版本與tomcat版本操作步驟不同罐氨,在進(jìn)行下列操作前請(qǐng)檢查你的版本是否和我的一致害幅。下面是步驟
2.1 下載solr與tomcat
solr下載可以去它的官網(wǎng):https://lucene.apache.org/solr/downloads.html。src.tgz結(jié)尾的是源碼岂昭,tgz結(jié)尾的是Linux版以现,zip結(jié)尾的是windows版狠怨,注意根據(jù)你的操作系統(tǒng)選擇不同的版本。
tomcat下載也可以去官網(wǎng):http://tomcat.apache.org/
2.2 復(fù)制webapp
將上面下載的兩個(gè)壓縮包解壓后邑遏,將solr目錄下的server目錄下的solr-webapp目錄下的webapp文件夾復(fù)制到tomcat的webapps目錄下并重命名為solr
2.3 復(fù)制jar包
將solr-8.5.1\server\lib\ext下的所有jar包佣赖,以及solr-8.5.1\server\lib下以metrics開(kāi)頭的jar、gmetric4j-1.0.7.jar以及以http2開(kāi)頭的jar復(fù)制到apache-tomcat-9\webapps\solr\WEB-INF\lib下
2.4 復(fù)制log4j2.xml
在tomcat\webapps\solr\WEB-INF中记盒,新建classes文件夾憎蛤,將solr-8.5.1\server\resources下的log4j2-console.xml與log4j2.xml文件拷貝到里面
2.5 修改web.xml
配置apache-tomcat-9\webapps\solr\WEB-INF下的web.xml
-
添加配置:
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>D:/software/solr/solr_home</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
solr_home是下面將要?jiǎng)?chuàng)建的目錄
-
注釋掉以下配置:
<!-- Get rid of error message --> <!-- <security-constraint> <web-resource-collection> <web-resource-name>Disable TRACE</web-resource-name> <url-pattern>/</url-pattern> <http-method>TRACE</http-method> </web-resource-collection> <auth-constraint/> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>Enable everything but TRACE</web-resource-name> <url-pattern>/</url-pattern> <http-method-omission>TRACE</http-method-omission> </web-resource-collection> </security-constraint> -->
2.6 修改log4j2.xml
修改apache-tomcat-9\webapps\solr\WEB-INF\classes\log4j2.xml文件:需要把所有${sys:solr.log.dir}修改為自己的指定的真實(shí)路徑,我是修改為了tomcat下的logs目錄
<RollingRandomAccessFile
name="MainLogFile"
fileName="D:/software/solr/apache-tomcat-solr/logs/solr.log"
filePattern="D:/software/solr/apache-tomcat-solr/logs/solr.log.%i" >
<PatternLayout>
<Pattern>
%maxLen{%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p (%t) [%X{collection} %X{shard} %X{replica} %X{core}] %c{1.} %m%notEmpty{ =>%ex{short}}}{10240}%n
</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="32 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingRandomAccessFile>
<RollingRandomAccessFile
name="SlowLogFile"
fileName="D:/software/solr/apache-tomcat-solr/logs/solr_slow_requests.log"
filePattern="D:/software/solr/apache-tomcat-solr/logs/solr_slow_requests.log.%i" >
<PatternLayout>
<Pattern>
%maxLen{%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p (%t) [%X{collection} %X{shard} %X{replica} %X{core}] %c{1.} %m%notEmpty{ =>%ex{short}}}{10240}%n
</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="32 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingRandomAccessFile>
2.7 創(chuàng)建Solr CoreAdmin管理(Solr Home)
在solr的同級(jí)目錄創(chuàng)建一個(gè)solr_home文件夾纪吮,
拷貝solr-8.5.1\server\solr\下所有文件俩檬、文件夾復(fù)制到solr_home目錄下
拷貝solr-8.5.1下contrib和dist文件夾至solr_home目錄下
在solr_home目錄下新建demo_core文件夾;并復(fù)制solr_home\configsets\sample_techproducts_configs\目錄下conf文件夾至solr_home\demo_core下
-
修改solr_home\demo_core\conf\solrconfig.xml文件
<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:../}/dist/" regex="solr-ltr-\d.*\.jar" /> <lib dir="${solr.install.dir:../}/contrib/velocity/lib" regex=".*\.jar" /> <lib dir="${solr.install.dir:../}/dist/" regex="solr-velocity-\d.*\.jar" />
3碾盟、整合IKAnalyzer中文分詞器
這個(gè)項(xiàng)目的github地址為:https://github.com/magese/ik-analyzer-solr
將jar包放入Solr服務(wù)的
Jetty
或Tomcat
的webapp/WEB-INF/lib/
目錄下棚辽;-
將
resources
目錄下的5個(gè)配置文件放入solr服務(wù)的Jetty
或Tomcat
的webapp/WEB-INF/classes/
目錄下;① IKAnalyzer.cfg.xml ② ext.dic ③ stopword.dic ④ ik.conf ⑤ dynamicdic.txt
-
配置Solr的
managed-schema
冰肴,添加ik分詞器
屈藐,示例如下;<!-- ik分詞器 --> <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>
4熙尉、managed-schema文件
solr_home/core_demo/conf下managed-schema文件联逻,這個(gè)文件主要定義Field和FieldType,F(xiàn)ield可以理解為數(shù)據(jù)庫(kù)中的一個(gè)字段检痰,F(xiàn)ieldType是字段類型包归,managed-schema文件預(yù)先給我們定義了很多字段與字段類型,
4.1 field
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
上面的代碼是一個(gè)字段的定義铅歼,這個(gè)字段的名稱是id箫踩,類型是string,這是solr的內(nèi)置類型
- name:指定域的名稱(自定義)
- type:指定域的類型
- indexed:是否索引(是否顯示到頁(yè)面索引)
是:(將分好的詞進(jìn)行索引谭贪,索引的目的,就是為了搜索)
否:不索引锦担,也就是不對(duì)該field域進(jìn)行搜索俭识。 - stored:是否存儲(chǔ)(是否能搜索到)
是:將field域中的內(nèi)容存儲(chǔ)到文檔域中。存儲(chǔ)的目的洞渔,就是為了搜索頁(yè)面顯示取值用的
否:不將field域中的內(nèi)容存儲(chǔ)到文檔域中套媚。不存儲(chǔ),則搜索頁(yè)面中沒(méi)法獲取該field域的值磁椒。 - required:是否必須
- multiValued:是否多值堤瘤,比如查詢數(shù)據(jù)需要關(guān)聯(lián)多個(gè)字段數(shù)據(jù),一個(gè)Field存儲(chǔ)多個(gè)值信息浆熔,必須將multiValued設(shè)置為true本辐。
4.2 dynamicField
dynamicField顧名思義就是動(dòng)態(tài)字段,比如:
<dynamicField name="*_i" type="pint" indexed="true" stored="true"/>
上面這個(gè)動(dòng)態(tài)字段就表示所有以"_i"結(jié)尾的字段
4.3 uniqueKey
唯一鍵,在一個(gè)managed-schema文件中只允許有一個(gè):
<uniqueKey>id</uniqueKey>
其中的id是在Field標(biāo)簽中已經(jīng)定義好的域名慎皱,而且該域設(shè)置為required為true老虫。
4.4 copyField
復(fù)制字段,這個(gè)字段的作用可以這樣理解:比如說(shuō)我們想要查詢?cè)诜N類和商品名稱中都含有手機(jī)的商品就可以這樣定義
<field name="cat" type="string" indexed="true" stored="true" multiValued="true"/>
<field name="name" type="text_general" indexed="true" stored="true"/>
<copyField source="cat" dest="text"/>
<copyField source="name" dest="text"/>
<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
4.5 fieldType
<field name="pre" type="preanalyzed" indexed="true" stored="true"/>
<field name="sku" type="text_en_splitting_tight" indexed="true" stored="true" omitNorms="true"/>
<field name="name" type="text_general" indexed="true" stored="true"/>
<field name="manu" type="text_gen_sort" indexed="true" stored="true" omitNorms="true" multiValued="false"/>
<field name="cat" type="string" indexed="true" stored="true" multiValued="true"/>
<field name="features" type="text_general" indexed="true" stored="true" multiValued="true"/>
<field name="includes" type="text_general" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />
<field name="weight" type="pfloat" indexed="true" stored="true"/>
<field name="price" type="pfloat" indexed="true" stored="true"/>
<field name="popularity" type="pint" indexed="true" stored="true" />
<field name="inStock" type="boolean" indexed="true" stored="true" />
<field name="store" type="location" indexed="true" stored="true"/>
從上面的代碼可以看出茫多,solr至少有pfloat祈匙、pint、boolean天揖、string等類型夺欲。這幾個(gè)類型也是內(nèi)置類型的別名:
<fieldType name="pint" class="solr.IntPointField" docValues="true"/>
<fieldType name="pfloat" class="solr.FloatPointField" docValues="true"/>
<fieldType name="plong" class="solr.LongPointField" docValues="true"/>
<fieldType name="pdouble" class="solr.DoublePointField" docValues="true"/>
<fieldType name="pints" class="solr.IntPointField" docValues="true" multiValued="true"/>
<fieldType name="pfloats" class="solr.FloatPointField" docValues="true" multiValued="true"/>
<fieldType name="plongs" class="solr.LongPointField" docValues="true" multiValued="true"/>
<fieldType name="pdoubles" class="solr.DoublePointField" docValues="true" multiValued="true"/>
還可以自定義類型:
<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>
上面定義了一個(gè)新的類型:text_ik,相當(dāng)于起了個(gè)別名今膊,并同時(shí)定義了分析器些阅。
Name:指定域類型的名稱
Class:指定該域類型對(duì)應(yīng)的solr的類型
Analyzer:指定分析器
Type:index、query万细,分別指定搜索和索引時(shí)的分析器
Tokenizer:指定分詞器
Filter:指定過(guò)濾器
5扑眉、客戶端查詢語(yǔ)法
- q 查詢的關(guān)鍵字,此參數(shù)最為重要赖钞,例如腰素,q=id:1,默認(rèn)為q= : 雪营,
- fl 指定返回哪些字段弓千,?逗號(hào)或空格分隔,注意:字段區(qū)分??寫献起,例如洋访,fl= id,title,sort
- start 返回結(jié)果的第?條記錄開(kāi)始,?般分??谴餐,默認(rèn)0開(kāi)始
- rows 指定返回結(jié)果最多有多少條記錄姻政,默認(rèn)值為 10,配合start實(shí)現(xiàn)分?
- sort 排序?式岂嗓,例如id desc 表示按照 “id” 降序
- wt (writer type)指定輸出格式汁展,有 xml, json, php等
- fq (filter query)過(guò)慮查詢,提供?個(gè)可選的篩選器查詢厌殉。返回在q查詢符合結(jié)果中同時(shí)符合的fq條
件的查詢結(jié)果食绿,例如:q=id:1&fq=sort:[1 TO 5],找關(guān)鍵字id為1 的公罕,并且sort是1到5之間的器紧。 - df 默認(rèn)的查詢字段,?般默認(rèn)指定楼眷。
- qt (query type)指定那個(gè)類型來(lái)處理查詢請(qǐng)求铲汪,?般不?指定熊尉,默認(rèn)是standard。
- indent 返回的結(jié)果是否縮進(jìn)桥状,默認(rèn)關(guān)閉帽揪,? indent=true|on 開(kāi)啟,?般調(diào)試json,php,phps,ruby輸出
才有必要?這個(gè)參數(shù)辅斟。 - version 查詢語(yǔ)法的版本转晰,建議不使?它,由服務(wù)器指定默認(rèn)值士飒。
- *表示所有查邢,比如*:*表示查詢所有字段所有條件