solr基礎(chǔ)

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

  1. 將jar包放入Solr服務(wù)的JettyTomcatwebapp/WEB-INF/lib/目錄下棚辽;

  2. resources目錄下的5個(gè)配置文件放入solr服務(wù)的JettyTomcatwebapp/WEB-INF/classes/目錄下;

    ① IKAnalyzer.cfg.xml
    ② ext.dic
    ③ stopword.dic
    ④ ik.conf
    ⑤ dynamicdic.txt
    
  3. 配置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)值士飒。
  • *表示所有查邢,比如*:*表示查詢所有字段所有條件
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市酵幕,隨后出現(xiàn)的幾起案子扰藕,更是在濱河造成了極大的恐慌,老刑警劉巖芳撒,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邓深,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡笔刹,警方通過(guò)查閱死者的電腦和手機(jī)芥备,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)舌菜,“玉大人萌壳,你說(shuō)我怎么就攤上這事∪赵拢” “怎么了袱瓮?”我有些...
    開(kāi)封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)爱咬。 經(jīng)常有香客問(wèn)我尺借,道長(zhǎng),這世上最難降的妖魔是什么精拟? 我笑而不...
    開(kāi)封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任燎斩,我火速辦了婚禮,結(jié)果婚禮上串前,老公的妹妹穿的比我還像新娘。我一直安慰自己实蔽,他們只是感情好荡碾,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著局装,像睡著了一般坛吁。 火紅的嫁衣襯著肌膚如雪劳殖。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天拨脉,我揣著相機(jī)與錄音哆姻,去河邊找鬼。 笑死玫膀,一個(gè)胖子當(dāng)著我的面吹牛矛缨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帖旨,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼箕昭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了解阅?” 一聲冷哼從身側(cè)響起落竹,我...
    開(kāi)封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎货抄,沒(méi)想到半個(gè)月后述召,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蟹地,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年积暖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锈津。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呀酸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琼梆,到底是詐尸還是另有隱情性誉,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布茎杂,位于F島的核電站错览,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏煌往。R本人自食惡果不足惜倾哺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刽脖。 院中可真熱鬧羞海,春花似錦、人聲如沸曲管。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)院水。三九已至腊徙,卻和暖如春简十,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撬腾。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工螟蝙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人民傻。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓胰默,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親饰潜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子初坠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容