2.2 Field的Boost
如果說Document的Boost是一條線,那麼Field的Boost則是一個點。怎麼理解這個點呢?設定Document的Boost會影響所有欄位。在搜尋的過程中,一般至少會搜尋兩個Field,比如同時搜尋標題和內容。而Document的Boost將同時影響標題和內容的搜尋得分,但是設定Field的Boost則不會有那麼大的影響,Field的Boost只會影響一個點。那這個點有什麼用呢?
現在來做個假設,假設,現在有一條記錄是關於Lucene的,這篇文章講得很好,我想要讓別人搜尋Lucene這個關鍵字的時候,這條記錄一定排在前10。怎麼辦?設定Docuement的Boost?設定得還很高?OK!這篇文章裡面也有其他關鍵字,比如"asp.net","Sql Server"。現在搜尋"asp.net",發現這篇文章也跑到前10了。這可不是我想要的。
怎麼辦呢?
現在有兩個解決辦法,一個就是冗餘一個Field,裡面記錄了Tag一類的東西,給這篇文章設定Tag值為“Lucene”,同時在索引tag欄位的時候把它的Boost調高。比如代碼2.2.1,在添加完文檔後把該文檔的tag這個Field Boost設定為想要的。
代碼2.2.1
1/**//// <summary>
2/// 添加文檔
3/// </summary>
4/// <param name="writer">維護文件管理器</param>
5/// <param name="title">標題</param>
6/// <param name="content">內容</param>
7/// <param name="tag">tag</param>
8/// <param name="boost">tag的boost</param>
9void AddDocument(IndexWriter writer, string title, string content, string tag, float boost)
10{
11 Document document = new Document();
12 document.Add(new Field("title", title, Field.Store.YES, Field.Index.TOKENIZED));
13 document.Add(new Field("content", content, Field.Store.YES, Field.Index.TOKENIZED));
14 document.Add(new Field("tag", content, Field.Store.YES, Field.Index.TOKENIZED));
15 document.GetField("tag").SetBoost(boost);
16 writer.AddDocument(document);
17}
當然,這樣處理不是很好,一來,增加一個欄位,給維護上帶來難度,而且很多好文章沒tag怎麼辦,再有就是非站內搜尋呢?另一種辦法就是設定一個字數相對較少的欄位,調高它的Boost。
比如,我現在把Title這個欄位的Boost調成1.3,也就是說我搜尋的時候,title的權重要比content的高,那麼當我標題中含有Lucene的時候,得分總是會偏高,那樣,就可以把記錄調到前面去了。這裡千萬不要調高content,如果全部調的話影響也不是太大,但是對於搜尋整體的品質有很大影響。為什麼這麼說呢?因為如果標題裡含有一個keyword "a",那麼這篇文章一般有關於這個“a”的內容,但是如果內容裡含有“a”而標題沒有,非常多的文章實際上都不是講“a”的。
2.3 怎麼有效調整得分
這裡只是我的一些調整的經驗,其實想一想也就明白了,沒什麼深奧的。
(1)、首先,標題的權重一定比內容的要高;
(2)、根據實際情況調整權重;
比如,現在要索引論壇的內容,那完全可以設定內容很少的文章權重非常低,這個時候直接設定Document的權重就行了;而如果這個文章的回複或者訪問量 又非常高,那麼每個回複或者瀏覽量,給加0.01的基數,讓這個總體量不超過0.2;要是這個文章是精華貼呢?直接加上0.1吧。
實際的調整過程就是你把各種問題想想全面就好了。
(3)、如果要把一個文檔的Document的Boost調得非常高,比如調整成2,那麼千萬要注意,減少它的內容,內容中出現的詞越少越好;
比如,像baidu那種的做個廣告,那麼就在裡面放一個商家買的關鍵詞就行了,其它什麼也不要。
(4)、寧可設定Field,比設定Document來得好,設定的方法就不用說啦。
要注意的是,越短的文章,越要降低它的權重。比如它只有兩個字,怎麼也要把它的權重調到0.1一下。為什嗎?因為兩個字一般是一個詞,這個詞如果被搜尋,得分就是1,你不調?那不是讓水貼浮到最上層了嗎?
以上都是些經驗之談,大家可以結合實際情況自己做一些調整。經驗主義,有錯誤和不足的地方,大家多包涵,指正,呵呵。