lucene中Field.Index,Field.Store詳解

lucene在doc.add(new Field("content",curArt.getContent(),Field.Store.NO,Field.Index.TOKENIZED));
Field有兩個屬性可選:存儲和索引。性能

經過存儲屬性你能夠控制是否對這個Field進行存儲;索引

經過索引屬性你能夠控制是否對該Field進行索引。內存

事實上對這兩個屬性的正確組合很重要。文檔

Field.Index Field.Store 說明
TOKENIZED(分詞) YES 被分詞索引且存儲
TOKENIZED NO 被分詞索引但不存儲
NO YES 這是不能被搜索的,它只是被搜索內容的附屬物。如URL等
UN_TOKENIZED YES/NO 不被分詞,它做爲一個總體被搜索,搜一部分是搜不出來的
NO NO 沒有這種用法


咱們那文章表爲例.articleinfo.有ID,title(標題),sumary(摘要),content(內容),userName(用戶名)get

其中title(標題),sumary(摘要)屬於第一種狀況,既要索引也要分詞,也要存儲.it

content(內容)要分詞,索引,但不存儲.因爲他太大了,並且界面也不用顯示整個內容.table

ID要存儲,不用索引.由於沒人用他來查詢.但拼URL卻很須要他.索引要存儲.class

userName(用戶名)索引,但不分詞.可用保存.爲何不分詞?好比"成吉思汗",我不想被"成漢"搜索到.我但願要麼"成吉思汗"或者"*吉思*"通配符搜到.搜索

總結以下:二進制

1.若是要對某Field進行查找,那麼必定要把Field.Index設置爲TOKENIZED或UN_TOKENIZED。TOKENIZED會對Field的內容進行分詞;而UN_TOKENIZED不會,只有全詞匹配,該Field纔會被選中。
2.若是Field.Store是No,那麼就沒法在搜索結果中從索引數據直接提取該域的值,會使null。

補充:

       Field.Store.YES:存儲字段值(未分詞前的字段值)
       Field.Store.NO:不存儲,存儲與索引沒有關係
       Field.Store.COMPRESS:壓縮存儲,用於長文本或二進制,但性能受損

 

   Index.NO:不須要索引

   Index.TOKENIZED:先被分詞再被索引

   Index.UN_TOKENIZED:不對該Field進行分詞,但會對它進行索引

   Index.NO_NORMS:對該Field進行索引,可是不使用Analyzer,同時禁止它參加評分,主要是爲了減小內存的消耗。

 

       Field.Index.ANALYZED:分詞建索引       Field.Index.ANALYZED_NO_NORMS:分詞建索引,可是Field的值不像一般那樣被保存,而是隻取一個byte,這樣節約存儲空間       Field.Index.NOT_ANALYZED:不分詞且索引       Field.Index.NOT_ANALYZED_NO_NORMS:不分詞建索引,Field的值去一個byte保存       TermVector表示文檔的條目(由一個Document和Field定位)和它們在當前文檔中所出現的次數       Field.TermVector.YES:爲每一個文檔(Document)存儲該字段的TermVector       Field.TermVector.NO:不存儲TermVector       Field.TermVector.WITH_POSITIONS:存儲位置       Field.TermVector.WITH_OFFSETS:存儲偏移量       Field.TermVector.WITH_POSITIONS_OFFSETS:存儲位置和偏移量

相關文章
相關標籤/搜索