1、Solr綜述

什麼是Solr搜索

咱們常常會用到搜索功能,因此也比較熟悉,這裏就簡單的介紹一下搜索的原理。 web

固然只是介紹solr的原理,並非搜索引擎的原理,那會更復雜。 數據庫

流程圖 json

這是一個很是簡單的流程圖: 數據庫設計

User:即須要搜索的用戶。 ui

Raw Data:須要搜索的內容,固然是源數據,多是文本文件,多是數據庫的數據,多是XML等等。 搜索引擎

Index:有格式的數據。 spa

 

其實從圖中能夠看出來: 設計

  1. Solr搜索很是相似於讀寫數據庫的過程。
  2. Solr搜索最主要的兩個問題(細節已經封裝好):
    1. 怎樣從元數據合理組織格式化成Index
    2. 怎樣根據關鍵字從Index中調取相關數據(排序、模糊查詢等等)。

 

類比一下,Index就至關於數據表,裏面有不少記錄,咱們須要作的就是設計數據表的格式,有哪些列。而且根據關鍵字搜索。 orm

Solr綜述

Solr實際上是一個WebApp,在官網下載後將war包放在web'容器下即可以直接運行,你本身的web項目經過HTTP請求的方式和Solr交互。固然須要如今Solr中生成索引庫(相似不一樣的數據表)。HTTP請求中帶有相關參數(關鍵字、須要搜索的索引庫、排序規則….)。那麼想愛先簡單介紹下一些相關的概念: xml

索引Index,文檔Docements,域Fields

Solr中數據最小單元爲Field,好比Name、Age。Documents是一個具體的對象,如人。舉例說明:Edwin是一我的,那麼能夠將Edwin抽象爲一個Document,這個Document包含不少Fields,Name、Age、Sex….。一個索引庫Index由許多Documents組成。

Index(Student) ß Docements(Edwin、AngelaBaby…) ß Fields(Name、Age…)

是否是很像數據庫的模型? 其實徹底能夠把這個理解爲數據庫… 而且Index還真的有主鍵的概念,叫作Unique Field。

 

查詢Query

上面解決了數據格式化成Index的問題,那麼還剩下怎樣根據關鍵字查詢搜索結果的問題,先舉個例子:

http://localhost:8983/solr/Artist/select?q=Artist_Name:周杰倫 &wt=json&indent=true

這就是web項目和Solr交互的一個Url

Localhost:8983/solr 這個事Solr項目

Artist是索引庫Index

q=Artist_Name:周杰倫

        q表明Query 意思是查詢Artist_Name爲周杰倫的數據

wt=json 指結果按照Json形式返回

indent=true 返回的數據格式化(也就是好看一點~)

 

經過這一個簡單的請求,便可以明白Solr請求的一個基本過程了,有什麼需求加什麼參數,以後Solr解析請求,根據本身的匹配規則,一個很複雜的公式,計算全部Documents的得分,得分高的優先返回。最後Web項目得到獲得搜索結果,格式化輸出。

 

 

兩個重要的文件

Schema.xml

這個文件其實就是對Index的配置,包括Field的類型,Unique Field,分詞等等。

先看看總體結構:

  1.  
  2.   <schema name="Artist" version="1.1">
  3.    <fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
  4.    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
  5.    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
  6.   <field name="ID" type="int" indexed="true" stored="true" multiValued="false" required="true"/>
  7.    <field name="Name" type="text_ik" indexed="true" stored="true"/>
  8.    <field name="Name_Exact" type="string" indexed="true" stored="true" />
  9.    <field name="SpaceID" type="long" indexed="true" stored="true"/>
  10.    <field name="PinYin" type="text_general" indexed="true" stored="true"/>
  11.    <field name="SongNum" type="int" indexed="true" stored="true"/>
  12.  
  13.    <copyField source="Artist_Name" dest="Artist_Name_Exact" />
  14.  <!-- field to use to determine and enforce document uniqueness. -->
  15.  <uniqueKey>ID</uniqueKey>
  16.  
  17.  <!-- field for the QueryParser to use when an explicit fieldname is absent -->
  18.  <defaultSearchField>ID</defaultSearchField>
  19.  
  20. <!-- Chinese -->
  21.    <fieldType name="text_ik" class="solr.TextField">
  22.         <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
  23.         <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
  24.    </fieldType>
  25.  
  26.  <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
  27.  <solrQueryParser defaultOperator="OR"/>
  28. </schema>

 

 

FieldType表明Field的類型,能夠自定義也可使用Solr提供的Type,具體支持的Type能夠參考Solr文檔,其中須要稍微解釋一下的是string,實現的class是solr.StrField,string的意思是將Field當成字符串,那麼若是在搜索時,不會進行分詞。只能總體匹配,例如將Name設置爲string,那麼當搜索周杰倫的時候,只有Name徹底和周杰倫相同纔會被匹配,周杰,周杰倫你好…這些都不會匹配,這個在精確查找時頗有用。

Unique Field :實際上是主鍵的意思,就是說在全部的Documents中被設置成Unique的Field只能有惟一值。固然在Index生成的時候,不用去重,Solr並不會報錯,好比向Solr輸入

ID:1 Name:張三

ID:1 Name:李四

若是ID爲Unique Field,那麼Solr可能會根據前後順序,只會存儲一個ID爲1的Document,剩餘重複ID的Document會被忽略。

Field中還有不少屬性:

        Name和Type就不說了

        Indexed:表示此Field是否索引,意思就是可否被搜索到,若是Name設置爲false,那麼搜索Name=周杰倫是沒有結果的。

        Stored:表示此Field是否被存儲。

        multiValued:表示此Field可否有多值,即Category能夠有多個值:如原創歌手、華語男歌手等等。默認false,Unique Field必須顯式設置爲false。

        Required:表示此Field是否能爲空,默認false,Unique Field必須設置爲true。

  1. <copyField source="Name" dest="Name_Exact" />

這是一個頗有用的東西,從名字就能看出來是賦值Field,最大的做用即是可讓一個Field有多個不一樣的Type。

好比Name一個能夠設置爲text_ik(分詞器,能夠看個人博客:3、Solr多核心及分詞器(IK)配置)

一個設置爲string

那麼模糊搜索時,可使用Name,精確搜索時使用Name_Exact。

 

 

Solrconfig.xml

Scheme.xml是對索引庫中Documents的配置,那麼solrconfig就是對索引庫的總體配置。配置requestHandler,有點相似於filter,就是在請求先後對請求進行預處理。這個以後碰到具體狀況再具體分析,由於通常狀況下設置好了以後,極少須要改動此文件。

 

總結

    其實我我的使用Solr後以爲,如上面畫的簡單的流程圖,最重要的兩個問題:

  1. 查詢條件

    查詢哪些Field,用什麼方式查詢,什麼排序,好比按照更新時間排序,仍是在搜索歌曲時HQ、SQ優先等等,主要用到了Url參數、solrconfig中的requestHandler。

  2. Index的設計

    這是重中之重,我以爲大部分狀況下應該都是使用solr從數據庫中讀取數據生成索引,這就要求原來的數據庫設計就要比較合理,若是原來的數據庫比較亂,那麼就須要大量的SQL將表聯結等等操做,而且出錯的機率也高。

相關文章
相關標籤/搜索