咱們常常會用到搜索功能,因此也比較熟悉,這裏就簡單的介紹一下搜索的原理。 web
固然只是介紹solr的原理,並非搜索引擎的原理,那會更復雜。 數據庫
流程圖 json
這是一個很是簡單的流程圖: 數據庫設計
User:即須要搜索的用戶。 ui
Raw Data:須要搜索的內容,固然是源數據,多是文本文件,多是數據庫的數據,多是XML等等。 搜索引擎
Index:有格式的數據。 spa
其實從圖中能夠看出來: 設計
類比一下,Index就至關於數據表,裏面有不少記錄,咱們須要作的就是設計數據表的格式,有哪些列。而且根據關鍵字搜索。 orm
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,分詞等等。
先看看總體結構:
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。
這是一個頗有用的東西,從名字就能看出來是賦值Field,最大的做用即是可讓一個Field有多個不一樣的Type。
好比Name一個能夠設置爲text_ik(分詞器,能夠看個人博客:3、Solr多核心及分詞器(IK)配置)
一個設置爲string
那麼模糊搜索時,可使用Name,精確搜索時使用Name_Exact。
Solrconfig.xml
Scheme.xml是對索引庫中Documents的配置,那麼solrconfig就是對索引庫的總體配置。配置requestHandler,有點相似於filter,就是在請求先後對請求進行預處理。這個以後碰到具體狀況再具體分析,由於通常狀況下設置好了以後,極少須要改動此文件。
其實我我的使用Solr後以爲,如上面畫的簡單的流程圖,最重要的兩個問題:
查詢哪些Field,用什麼方式查詢,什麼排序,好比按照更新時間排序,仍是在搜索歌曲時HQ、SQ優先等等,主要用到了Url參數、solrconfig中的requestHandler。
這是重中之重,我以爲大部分狀況下應該都是使用solr從數據庫中讀取數據生成索引,這就要求原來的數據庫設計就要比較合理,若是原來的數據庫比較亂,那麼就須要大量的SQL將表聯結等等操做,而且出錯的機率也高。