天天看點

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

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設定為想要的。

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)
Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

代碼2.2.1

 1

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)
Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

/**//// <summary>

 2

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

/// 添加文檔

 3

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

/// </summary>

 4

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

/// <param name="writer">維護文檔管理器</param>

 5

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

/// <param name="title">标題</param>

 6

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

/// <param name="content">内容</param>

 7

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

/// <param name="tag">tag</param>

 8

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

/// <param name="boost">tag的boost</param>

 9

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

void AddDocument(IndexWriter writer, string title, string content, string tag, float boost)

10

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)
Lucene.Net 2.3.1開發介紹 —— 三、索引(六)
Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

{

11

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

    Document document = new Document();

12

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

    document.Add(new Field("title", title, Field.Store.YES, Field.Index.TOKENIZED));

13

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

    document.Add(new Field("content", content, Field.Store.YES, Field.Index.TOKENIZED));

14

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

    document.Add(new Field("tag", content, Field.Store.YES, Field.Index.TOKENIZED));

15

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

    document.GetField("tag").SetBoost(boost);

16

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

    writer.AddDocument(document);

17

Lucene.Net 2.3.1開發介紹 —— 三、索引(六)

}

當然,這樣處理不是很好,一來,增加一個字段,給維護上帶來難度,而且很多好文章沒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,你不調?那不是讓水貼浮到最上層了麼?

以上都是些經驗之談,大家可以結合實際情況自己做一些調整。經驗主義,有錯誤和不足的地方,大家多包涵,指正,呵呵。