簡單來講Solr是基於Lucene的高性能的,開源的Java企業搜索服務器。Solr能夠看做一個Web app,運行在tomcat或Jetty這類HTTP服務器上,java
底層是一個基於Lucene的搜索引擎,還附加一個Solr的基本管理界面。Solr提供HTTP服務,經過Get方法進行查詢,經過Post方法進行索引的添加/刪除管理。web
通常來講Solr的查詢時經過Get方法請求到HTTP服務器的solr這個app下的/select對應的servlet上去,而添加等操做時經過POST方法到HTTP服務器的算法
Solr這個app下的/update對應的servlet方法上去。數據庫
Solr做爲搜索引擎,提供基於切面/高亮/多種輸出格式/複雜的語法搜索規則等功能。緩存
與Lucene的區別是:Lucene是一些類API是個工具包,經過這些API咱們能夠建立索引/經過索引查詢;而Solr是在此基礎上的封裝,經過簡單的配置tomcat
就能夠直接使用的開源搜索服務器。服務器
在Solr學習一中瞭解到搜索引擎的核心是創建索引,而後利用索引進行搜索。app
在Solr中索引涉及到的概念有:負載均衡
1 、 Core : 在Solr的單節點部署或者Master-Salve方式部署下標示一個完整索引。Core都是由多個文件組成,創建索引的時候是先分段,而後再合併的方式。ide
一個Solr能夠包含一個或多個Core,每一個Core的配置能夠不一樣;在SolrCoud部署下標示索引的一部分。
二、Collection: 在SolrCould部署模式下,指的是一個索引的邏輯概念。能夠把Solr中的Core或Collection看作一個Oracle的實例。一個SolrCould能夠包含多個Collection。
一個Collection能夠切分紅多個Shard,切分的數量大小和機器節點數和副本數有關係,要求shard數量*副本數<節點數*numShards 。注意一個節點標示啓動一個HTTP服務器,
一臺機器能夠起多個Solr節點(這種狀況必須設置不一樣的端口),一個Collection的內容是由每一個shard中的信息組成。一個shard的信息對應組成它的一個副本的信息。
三、Shard : 標示切片,在SolrColud 部署模式下,將一個邏輯索引Collection切割成多個分片, 每一個Shard是由多個副本Replica組成。
四、Replica : 副本。多個副本組成一個Shard、注意一個Shard中的replica 包含的內容邏輯上應該是同樣的,Shard的數據只是其中一份Replica,不是這些副本的組合。
這些副本中有一個副本會被選擇爲Leader,負責寫索引。
五、Zookeeper:另一個開源的軟件,在solrCloud部署模式下是必須的,主要做用是:
1)配置的統一存儲和分發;2)shard中副本的Leader的選取;3)負責監控集羣狀態,發生改變時候通知相關的監聽器,好比掛了一臺機器,這臺機器上若是有shard的leader節點,剩餘的同一個shard的其餘副本會競選Leader,且solrColud會知道這臺機器掛掉,在處理請求的時候就不發請求給這臺機器。
六、Config Set:配置組,存儲配置信息,每一個Collection都有,至少包含solrconfig.xml這個是配置這個collection基本配置,好比使用的Lucene的版本、使用的查詢組件、緩存相關信息等;還必須包含Schema.Xml 這個配置文件配置的是Collection存在的文檔的字段,包括字段的類型,是否須要存儲,是否須要分詞等。
七、文檔: 在Solr中創建索引是經過文檔添加的方式進行,若是將索引當作一張表,那麼文檔能夠當作是一條記錄,那麼Schema.xml能夠當作這個表的定義。
一個文檔由多個字段定義,這些是在Schema.xml中定義的,不是全部定義的字段文檔中都必須有,可是反過來文檔中有的字段必須在Schema.xml中定義,
好比: <field name="subAcctName" type="string" indexed="true" stored="true" /> 標示定義一個字段爲string類型,名稱爲:subAcctName
是被索引的,並且是存儲的。固然也能夠經過一種叫動態定義的方法進行字段的模糊匹配,好比 <dynamicField name="*_i" type="int" indexed="true" stored="true"/>就表示全部以_i結尾的字段都當成int來處理。
注意這裏面的類型不一樣於java的類型,只是類似,對於每一個類型,solr會定義其相關的處理規則等。好比:
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
標示string類型,對應的類爲StrField類,若是缺失這個字段,默認在搜索的時候是排在最後的。
Schema.xml 在定義文檔的字段時候會定義一個惟一值字段,似於表的主鍵,形如: <uniqueKey>id</uniqueKey>,做用是用於在solrCloud
模式下進行路由,Solr經過必定的算法對每一個文檔的ID進行計算,獲得的一個Hash值,而後看下這個Hash值是屬於哪一個shard,就把文檔發到哪一個shard上去。
經過這個算法能夠保證shard之間數量的均衡,在建索引能夠起到負載均衡的做用。
若是你要制定文檔存儲的shard,有三個辦法:
1)經過特殊的ID,這個ID必須有兩部分組成,兩部分之間用!號分隔,solr在計算hash的時候,會利用!前面的16bit作hash,而且利用後面16個bit作hash,
而後把它組合起來,這樣能夠保證這類文檔都發到特定的shard上,注意這個特定的shard上,而不知道是具體是哪個shard上。
2)經過_shard_字段來指定具體的shard上,這個字段設置爲shard一、shard2等。
3) 在建collection的時候路由器設置爲:implicit方式,在建索引的時候,文檔添加一個_route_字段,值爲:shard一、shard2等。
具體的語句舉例: http://x.x.x.x:xxx/solr-5.0.0-web/admin/collections?action=CREATE&name=testimplicit&router.name=implicit&shards=shard1,shard2,shard3
文檔在添加時候,若是以xml格式添加,內容相似:
<add><doc>
<field name=「id」>05991</field>
<field name=「name」>Peter Parker</field>
<field name=「supername」>Spider-Man</field>
<field name=「category」>superhero</field>
<field name=「powers」>agility</field>
<field name=「powers」>spider-sense</field>
</doc></add>
八、域(Field):相似於數據庫表的字段,有類型,有處理方式。注意我在Solr學習之一講的倒排索引中的詞典中的詞不一樣於字段。
域只有指明被索引後,而後被分詞器進行分詞(在solr中string等基本類型是不會被分詞的,text類型標示覆雜類型,須要分詞),以後纔會存儲在詞典中
域有幾個很是重要的屬性:
indexed: 標示是否被索引,簡單來講,只有被索引的字段,在查詢時候才能夠經過這個字段的值進行匹配查詢。
stored: 若是這個設置爲true標示在索引中也存儲這個字段信息;若是不存在這個信息,這查詢的結果中不會顯示,這適用於內容很是多的場景,
咱們經過查詢到的ID,再到其餘存儲中,好比數據庫中把對應的這個字段信息再抽出來。
域中有個特殊的域叫拷貝域,它的做用是,能夠將其餘域的值拷貝到這個域中,搜索的時候只要搜索這個域就能夠了。
<copyField source="title" dest="text"/>
<copyField source="content" dest="text"/>
將域title和content內容拷貝到text域裏面。
九、段(Segment)
十、詞(Term)
第一部分介紹組成詞典的部分,是詞法分析語法分析後獲得的字符串。
term由一對值組成:field name(string)和field value(bytes),同一個value在不一樣的field中有不一樣的含義。
文檔、索引、字段、詞之間的關係能夠用下圖描述:
《網上借來的圖》
一個索引是由多個段組成,在實際中段是一些列文件,一個段又是由多個文檔組成的,一個文檔又是由多個字段組成。
段獨立存在,做爲一個子索引,能夠被單獨搜索。
一個字段中的內容通過分詞變成Team 存儲在倒排索引中。
Lucene保存的索引信息,既包括正向信息又包含反向信息。
正向信息:按照從屬關係:索引(Index) –> 段(segment) –> 文檔(Document) –> 域(Field) –> 詞(Term)
通常上層不光包含本身的信息還包含部分的下層信息。
保存正向信息的文件有:
反向信息:
詞典到索引的映射,也即咱們說的倒排索引。