Lucene.NET中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(用戶名) 

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

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

ID要存儲,不用索引.因爲沒人用他來查詢.但拼URL卻很需要他.索引要存儲. 

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:壓縮存儲,用於長文本或二進制,但性能受損 

       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:存儲位置和偏移量
發佈了23 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章