全文檢索引擎Solr系列——入門篇

jopen 10年前發布 | 22K 次閱讀 Solr 搜索引擎

原文出處: ImportNew

Solr采用Lucene搜索庫為核心,提供全文索引和搜索開源企業平臺,提供REST的HTTP/XML和JSON的API,如果你是Solr新手,那么就和我一起來入門吧!本教程以solr4.8作為測試環境,jdk版本需要1.7及以上版本。

準備

本文假設你對Java有初中級以上水平,因此不再介紹Java相關環境的配置。下載解壓縮solr,在example目錄有start.jar文件,啟動:

java -jar start.jar

瀏覽器訪問:http://localhost:8983/solr/,你看到的就是solr的管理界面

索引數據

服務啟動后,目前你看到的界面沒有任何數據,你可以通過POSTing命令向Solr中添加(更新)文檔,刪除文檔,在exampledocs目錄包含一些示例文件,運行命令:

    java -jar post.jar solr.xml monitor.xml

上面的命令是向solr添加了兩份文檔,打開這兩個文件看看里面是什么內容,solr.xml里面的內容是:

    <add>
    <doc>
      <field name="id">SOLR1000</field>
      <field name="name">Solr, the Enterprise Search Server</field>
      <field name="manu">Apache Software Foundation</field>
      <field name="cat">software</field>
      <field name="cat">search</field>
      <field name="features">Advanced Full-Text Search Capabilities using Lucene</field>
      <field name="features">Optimized for High Volume Web Traffic</field>
      <field name="features">Standards Based Open Interfaces - XML and HTTP</field>
      <field name="features">Comprehensive HTML Administration Interfaces</field>
      <field name="features">Scalability - Efficient Replication to other Solr Search Servers</field>
      <field name="features">Flexible and Adaptable with XML configuration and Schema</field>
      <field name="features">Good unicode support: h&#xE9;llo (hello with an accent over the e)</field>
      <field name="price">0</field>
      <field name="popularity">10</field>
      <field name="inStock">true</field>
      <field name="incubationdate_dt">2006-01-17T00:00:00.000Z</field>
    </doc>
    </add>

表示向索引中添加一個文檔,文檔就是用來搜索的數據源,現在就可以通過管理界面搜索關鍵字”solr”,具體步驟是:

點擊頁面下的Execute Query按鈕后右側就會顯示查詢結果,這個結果就是剛才導入進去的solr.xml的json格式的展示結果。solr支持豐富的查詢語法,比如:現在想搜索字段name里面的關鍵字”Search”就可以用語法name:search,當然如果你搜索name:xxx就沒有返回結果了,因為文檔中沒有這樣的內容。

數據導入

導入數據到Solr的方式也是多種多樣的:

  • 可以使用DIH(DataImportHandler)從數據庫導入數據
  • 支持CSV文件導入,因此Excel數據也能輕松導入
  • 支持JSON格式文檔
  • 二進制文檔比如:Word、PDF
  • 還能以編程的方式來自定義導入

更新數據

如果同一份文檔solr.xml重復導入會出現什么情況呢?實際上solr會根據文檔的字段id來唯一標識文檔,如果導入的文檔的id已經存在solr中,那么這份文檔就被最新導入的同id的文檔自動替換。你可以自己嘗試試驗一下,觀察替換前后管理界面的幾個參數:Num DocsMax DocDeleted Docs的變化。

  • numDocs:當前系統中的文檔數量,它有可能大于xml文件個數,因為一個xml文件可能有多個<doc>標簽。
  • maxDoc:maxDoc有可能比numDocs的值要大,比如重復post同一份文件后,maxDoc值就增大了。
  • deletedDocs:重復post的文件會替換掉老的文檔,同時deltedDocs的值也會加1,不過這只是邏輯上的刪除,并沒有真正從索引中移除掉

刪除數據

通過id刪除指定的文檔,或者通過一個查詢來刪除匹配的文檔

    java -Ddata=args -jar post.jar "<delete><id>SOLR1000</id></delete>"
    java -Ddata=args -jar post.jar "<delete><query>name:DDR</query></delete>"

此時solr.xml文檔從索引中刪除了,再次搜”solr”時不再返回結果。當然solr也有數據庫中的事務,執行刪除命令的時候事務自動提交了,文檔就會立即從索引中刪除。你也可以把commit設置為false,手動提交事務。

    java -Ddata=args  -Dcommit=false -jar post.jar "<delete><id>3007WFP</id></delete>"

執行完上面的命令時文檔并沒有真正刪除,還是可以繼續搜索相關結果,最后可以通過命令:

    java -jar post.jar -

提交事務,文檔就徹底刪除了。現在把剛剛刪除的文件重新導入Solr中來,繼續我們的學習。

刪除所有數據:

    

http://localhost:8983/solr/collection1/update?stream.body=<delete><query>*:*</query></delete>&commit=true

刪除指定數據

    http://localhost:8983/solr/collection1/update?stream.body=<delete><query>title:abc</query></delete>&commit=true

多條件刪除

    http://localhost:8983/solr/collection1/update?stream.body=<delete><query>title:abc AND name:zhang</query></delete>&commit=true

查詢數據

查詢數據都是通過HTTP的GET請求獲取的,搜索關鍵字用參數q指定,另外還可以指定很多可選的參數來控制信息的返回,例如:用fl指定返回的字段,比如f1=name,那么返回的數據就只包括name字段的內容

    http://localhost:8983/solr/collection1/select?q=solr&fl=name&wt=json&indent=true
  • 排序

    Solr提供排序的功能,通過參數sort來指定,它支持正序、倒序,或者多個字段排序

    • q=video&sort=price desc
    • q=video&sort=price asc
    • q=video&sort=inStock asc, price desc
      默認條件下,Solr根據socre 倒序排列,socre是一條搜索記錄根據相關度計算出來的一個分數。
  • 高亮

    網頁搜索中,為了突出搜索結果,可能會對匹配的關鍵字高亮出來,Solr提供了很好的支持,只要指定參數:

    • hl=true #開啟高亮功能
    • hl.fl=name #指定需要高亮的字段
http://localhost:8983/solr/collection1/select?q=Search&wt=json&indent=true&hl=true&hl.fl=features
    返回的內容中包含:
                "highlighting":{
                       "SOLR1000":{
                           "features":["Advanced Full-Text <em>Search</em> Capabilities using Lucene"]
                       }
                }

文本分析

文本字段通過把文本分割成單詞以及運用各種轉換方法(如:小寫轉換、復數移除、詞干提取)后被索引,schema.xml文件中定義了字段在索引中,這些字段將作用于其中.
默認情況下搜索”power-shot”是不能匹配”powershot”的,通過修改schema.xml文件(solr/example/solr/collection1/conf目錄),把features和text字段替換成”text_en_splitting”類型,就能索引到了。

    <field name="features" type="text_en_splitting" indexed="true" stored="true" multiValued="true"/>
    ...
    <field name="text" type="text_en_splitting" indexed="true" stored="false" multiValued="true"/>

修改完后重啟solr,然后重新導入文檔

    java -jar post.jar *.xml

現在就可以匹配了

  • power-shot—>Powershot
  • features:recharing—>Rechargeable
  • 1 gigabyte –> 1G

總結

作為入門文章,本文沒有引入太多概念。安裝到部署,文檔更新,對solr有了初步感性的認識,下一篇將介紹全文檢索的基本原理。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!