Solr基本概念

前言

初次接觸solr,對其中的許多概念都模糊不清,經常是看過了轉眼就忘記了,因此在這裏整理一下常用的概念。數據庫

基本概念

index(索引)

  • 在Lucene中一個索引是放在一個文件夾中的,一個索引就是多個Document的集合
  • 同一個索引目錄中的全部文件構成一個Lucene索引。
  • 一個索引其實就是多個Document集合。

Document(文檔)

  • 文檔是咱們構建索引的基本單位,索引中的每一個Document就比如數據庫表中的每一條記錄Record,雖然不是一個概念,可是能夠這樣去理解。
  • 新增長的文檔是單獨保存在一個新生成的段文件中。

Field(域)

  • 一個Document其實就是一個Field的集合,每一個Field就比如數據庫表中的每一個字段column。
  • 不一樣Field能夠分別存儲不一樣信息,以及擁有各自不一樣的存儲方式。

Segment(段)

  • 當添加一個新文檔就會生成一個新的段,而且也會觸發段文件合併。
  • 一個索引能夠包含多個段文件,段與段質檢是相互獨立的。
  • 合併段文件有助於提高建立索引的性能。
  • 段文件裏記錄了索引中包含多少個段,每一個段包含多少個文檔。
  • 索引能夠由多個子索引構成。這個子索引便叫作段。

Term(詞)

  • 每一個Field的域值通過分詞器處理後獲得的每一項稱做Term
  • Term是索引中的最小單元。
  • 在兩個不一樣Field中的同一個字符串被認爲是不一樣的term。
  • Field的域值通過序列化(tokenized)成Terms集合(Terms)。

core

Core是一個單一的索引數據,而一個索引由多個Document組成,這些Document是扁平化的,即兩個Document的域徹底不一樣。數組

Solr 設計多Core主要是爲了解決生產環境下的以下關鍵需求:緩存

  1. 重建索引
  2. 配置變動影響最小化
  3. 索引合併和分裂
  4. Core熱交換

Indexed

表示是否須要建立索引,便是否須要添加到倒排索引表中,通常用來修飾Field域的,若是你不對某個域建立索引,那麼意味着你將不能根據改域的域值進行全文檢索。數據結構

Stored

表示是否須要存儲某個域的域值,通常表示是否須要將域值寫入到磁盤上進行持久化,持久化的目的是爲了查詢的時候能再次獲取返回給用戶作展現。固然存儲則意味着會增長索引文件的體積。若是你的索引目錄是基於內存的,那Stored設置true仍是false都沒什麼意義。性能

Tokenized

表示是否須要對某個域的域值進行分詞操做,若是你設置爲不分詞,那麼會把域值所有內容看成一個Term存入倒排索引表。翻譯

Norms

即Normalization的縮寫,翻譯過來就是標準化的意思。這裏表示是Lucene評分機制裏的標準化因子,使用標準化因子來影響文檔的最終評分。設計

multiValued

用於表示指定Field是不是一個多值域。咱們知道,域值通常是單個值,但有時候可能咱們的域值是一個List集合或者一個數組,這時候該如何處理域值創建索引呢?爲了解決這個問題,因此設計了多值域。orm

termVectors

表示是否對指定Field啓用空間向量模型,當你須要使用FastVector-Hightlighter高亮器或者MoreLikeThis功能時,你就須要啓用 termVectors。xml

termPositions

表示是否記錄Field的域值中的每一個Term的位置信息即記錄當前是文檔中的第幾個term,前提是你必需要先啓動termVectors。排序

termOffsets

表示記錄Field的域值中的每一個Term的位置偏移量,所謂偏移量,其實就是Term在文檔中的起始位置和結束位置,都是從零開始計算。好比I like Java這個字符串,其中單詞Java的位置偏移量就是[7,10]。

PositionIncrement

表示當前Term的位置與前一個term的位置之間的差值即位置增量,好比I like the girl with short hair(是的!!),這裏girl與like之間的位置增量爲2,由於like的position=1,girl的position=3。但若是考慮停用詞的狀況,嗎麼like和girl之間的the是停用詞,the會被剔除掉,此時girl與like之間的位置增量爲1。加入兩個term之間的positionincrement=0,那麼說明兩個Term處於文檔中同一個位置,利用這個特性能夠實現同義詞功能。

PositionIncrementGap

表示兩個Term之間的間隙,這是Solr Schema.xml裏field的配置屬性,通常用於解決多值域查詢phrase query的。好比你有個多值域,它有2個域值:author:John Doe;author:Bob Smith。對於多值域而言,默認PositoinIncrementGap=0,也就意味着默認多值域的域值是直接拼接在一塊兒的,即john doe bob smith,也就是說若是你輸入doe bob也是能夠搜索到該文檔的,若是你不但願用戶輸入doe bob能搜索到,那麼你能夠設置PositionIncrementGap=N,N是讓任意一個大於零的整數便可,這樣用戶就不能跨多個域值搜索了,只能在多值域的單個域值內實現關鍵字搜索了。

precisionStep

通常用於數字域的範圍查詢,默認值是4,調整這個屬性值能夠提高數字域的查詢性能。

DocValues

Lucene索引的存儲方式通常都是以倒排索引的方式(term-doc),即Term到Document的一個映射。可是在搜索相關功能處理的時候,如排序、高亮,須要經過文檔docid找到相應的term值、term的位置信息等。爲此,在Lucene4.0中,引入了一個新字段類型DocValue,即在索引的時候創建文檔到值(document-to-value)的映射。這個方法保證減輕了一些字段緩存的內存要求,而且使得Sorting、Faceting、Grouping、Fuction Query的響應速度更快。但開啓DocValues須要額外保存索引信息,所以會增大索引體積。

DocValues只適用於部分FieldType,這些FieldType底層實際又是使用的Lucene的DocValues Type。DocValues適用的FieldType以下:

  • StrField 和 UUIDField
    • 若是這個FieldType是單值域(即multi-value=false),那麼底層Lucene會使用SORTED類型。
    • 若是這個FieldType是多值域(即multi-value=true),那麼底層Lucene會使用SORTED_SET類型。
  • 全部以Trie開頭的數字域,date域,EnmuField
    • 若是這個FieldType是單值域(即multi-value=false),那麼底層Lucene會使用NUMERIC類型。
    • 若是這個FieldType是多值域(即multi-value=true),那麼底層Lucene會使用SORTED_SET類型。

DocValues的優缺點

  1. 近實時索引:在每個索引段裏面都會有一個docvalues數據結構,這個結構與所 win同時創建,而且可以快速更新、生效;
  2. 基本的查詢和過濾支持:你能夠作基本的詞、範圍等基本查詢,可是不竄域評分,而且速度較慢,若是你對速度和評分排序有要求,你能夠將該字段設置爲(indexed=「true」);
  3. 更好的壓縮比:Docvalues fields的壓縮效果比fieldcache好,但不強調作到極致;
  4. 節約內存:你能夠定義一個fieldType的docValuesFormat(docValuesFormat=「Disk」),這樣的只有一小部分數據加載到內存,其餘部分保留在磁盤上。

Payload

所謂payload其實就是提供用戶傳入一個額外的自定義信息,而該信息能夠干預文檔最終的評分。Payload信息跟term的位置(positions)信息同樣,都是存儲在倒排索引表中的,存儲它會額外增大索引體積。

相關文章
相關標籤/搜索