Solr學習之二-Solr基礎知識


一 基本說明

簡單來說Solr是基於Lucene的高性能的,開源的Java企業搜索服務器。Solr可以看作一個Web app,運行在tomcat或Jetty這類HTTP服務器上,

底層是一個基於Lucene的搜索引擎,還附加一個Solr的基本管理界面。Solr提供HTTP服務,通過Get方法進行查詢,通過Post方法進行索引的添加/刪除管理。

一般來說Solr的查詢時通過Get方法請求到HTTP服務器的solr這個app下的/select對應的servlet上去,而添加等操作時通過POST方法到HTTP服務器的

Solr這個app下的/update對應的servlet方法上去。

Solr作為搜索引擎,提供基於切面/高亮/多種輸出格式/復雜的語法搜索規則等功能。

與Lucene的區別是:Lucene是一些類API是個工具包,通過這些API我們可以創建索引/通過索引查詢;而Solr是在此基礎上的封裝,通過簡單的配置

就可以直接使用的開源搜索服務器。

 

二  基本概念

在Solr學習一中了解到搜索引擎的核心是建立索引,然后利用索引進行搜索。

在Solr中索引涉及到的概念有:

1 、 Core     : 在Solr的單節點部署或者Master-Salve方式部署下標示一個完整索引。Core都是由多個文件組成,建立索引的時候是先分段,然后再合並的方式。

  一個Solr可以包含一個或多個Core,每個Core的配置可以不同;在SolrCoud部署下標示索引的一部分。

2、Collection: 在SolrCould部署模式下,指的是一個索引的邏輯概念。可以把Solr中的Core或Collection看做一個Oracle的實例。一個SolrCould可以包含多個Collection。

一個Collection可以切分成多個Shard,切分的數量大小和機器節點數和副本數有關系,要求shard數量*副本數<節點數*numShards 。注意一個節點標示啟動一個HTTP服務器,

一台機器可以起多個Solr節點(這種情況必須設置不同的端口),一個Collection的內容是由每個shard中的信息組成。一個shard的信息對應組成它的一個副本的信息。

3、Shard    : 標示切片,在SolrColud 部署模式下,將一個邏輯索引Collection切割成多個分片, 每個Shard是由多個副本Replica組成。

4、Replica  : 副本。多個副本組成一個Shard、注意一個Shard中的replica 包含的內容邏輯上應該是一樣的,Shard的數據只是其中一份Replica,不是這些副本的組合。

這些副本中有一個副本會被選擇為Leader,負責寫索引。

5、Zookeeper:另外一個開源的軟件,在solrCloud部署模式下是必須的,主要作用是:

1)配置的統一存儲和分發;2)shard中副本的Leader的選取;3)負責監控集群狀態,發生改變時候通知相關的監聽器,比如掛了一台機器,這台機器上如果有shard的leader節點,剩余的同一個shard的其他副本會競選Leader,且solrColud會知道這台機器掛掉,在處理請求的時候就不發請求給這台機器。

6、Config Set:配置組,存儲配置信息,每個Collection都有,至少包含solrconfig.xml這個是配置這個collection基本配置,比如使用的Lucene的版本、使用的查詢組件、緩存相關信息等;還必須包含Schema.Xml 這個配置文件配置的是Collection存在的文檔的字段,包括字段的類型,是否需要存儲,是否需要分詞等。

7、文檔: 在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上,這個字段設置為shard1、shard2等。

3) 在建collection的時候路由器設置為:implicit方式,在建索引的時候,文檔添加一個_route_字段,值為:shard1、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>

8、域(Field):類似於數據庫表的字段,有類型,有處理方式。注意我在Solr學習之一講的倒排索引中的詞典中的詞不同於字段。

域只有指明被索引后,然后被分詞器進行分詞(在solr中string等基本類型是不會被分詞的,text類型標示復雜類型,需要分詞),之后才會存儲在詞典中

域有幾個非常重要的屬性:

indexed: 標示是否被索引,簡單來說,只有被索引的字段,在查詢時候才可以通過這個字段的值進行匹配查詢。

stored:   如果這個設置為true標示在索引中也存儲這個字段信息;如果不存在這個信息,這查詢的結果中不會顯示,這適用於內容非常多的場景,

我們通過查詢到的ID,再到其他存儲中,比如數據庫中把對應的這個字段信息再抽出來。

域中有個特殊的域叫拷貝域,它的作用是,可以將其他域的值拷貝到這個域中,搜索的時候只要搜索這個域就可以了。

<copyField source="title" dest="text"/>

<copyField source="content" dest="text"/>

 將域title和content內容拷貝到text域里面。

9、段(Segment)

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

10、詞(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                      保存了倒排表中每個詞在包含此詞的文檔中的位置。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM