Solr學習之二-Solr基礎知識

一 基本說明

簡單來講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)

  • 多個段組成索引,一個段由多個文件組成,新添加的文檔能夠生產新的段,不一樣的段之間能夠合併。
  • 在index目錄下以相同數字的文件開頭的屬於一個段.
  •  segments.gen和segments_* 屬於段的元數據信息,保存段的基本屬性。

十、詞(Term)

     第一部分介紹組成詞典的部分,是詞法分析語法分析後獲得的字符串。

     term由一對值組成:field name(string)和field value(bytes),同一個value在不一樣的field中有不一樣的含義。

 

文檔、索引、字段、詞之間的關係能夠用下圖描述:

《網上借來的圖》

一個索引是由多個段組成,在實際中段是一些列文件,一個段又是由多個文檔組成的,一個文檔又是由多個字段組成。

段獨立存在,做爲一個子索引,能夠被單獨搜索。

一個字段中的內容通過分詞變成Team 存儲在倒排索引中。

 Lucene保存的索引信息,既包括正向信息又包含反向信息。

正向信息:按照從屬關係:索引(Index) –> 段(segment) –> 文檔(Document) –> 域(Field) –> 詞(Term)

通常上層不光包含本身的信息還包含部分的下層信息。

保存正向信息的文件有:

  • segments_N                       保存了此索引包含多少個段,每一個段包含多少篇文檔。
  • XXX.fnm                            保存了此段包含了多少個域,每一個域的名稱及索引方式。
  • XXX.fdx,XXX.fdt               保存了此段包含的全部文檔,每篇文檔包含了多少域,每一個域保存了那些信息。
  • XXX.tvx,XXX.tvd,XXX.tvf 保存了此段包含多少文檔,每篇文檔包含了多少域,每一個域包含了多少詞,每一個詞的字符串,位置等信息。

反向信息:

      詞典到索引的映射,也即咱們說的倒排索引。

  • XXX.tis,XXX.tii          保存了詞典(Term Dictionary),也即此段包含的全部的詞按字典順序的排序。
  • XXX.frq                      保存了倒排表,也即包含每一個詞的文檔ID列表。
  • XXX.prx                      保存了倒排表中每一個詞在包含此詞的文檔中的位置。
相關文章
相關標籤/搜索