話接上篇,繼續來說權重對排序的影響。從上面的4個測試,只能說是有個直觀的理解了。“哦,是!調整權重是能影響排序了,但是好像沒辦法來分析到底怎麼調啊!”。似乎是這樣,現在需要把問題放大,加大索引的內容。到博客園新聞區,用zzk找了4篇內容包含“測試”的文章。代碼變成 2.1.5
代碼2.1.5
1using System;
2using System.Collections.Generic;
3using Lucene.Net.Analysis;
4using Lucene.Net.Analysis.Standard;
5using Lucene.Net.Documents;
6using Lucene.Net.Index;
7using Lucene.Net.QueryParsers;
8using Lucene.Net.Search;
9using NUnit.Framework;
10
11namespace Test
12{
13 [TestFixture]
14 public class StandardAnalyzerCaseTest
15 {
16 /**//// <summary>
17 /// 執行測試的入口
18 /// </summary>
19 [Test]
20 public void SearcherTest()
21 {
22 Index();
23 List<string> list = new List<string>() { "測試" };
24 for (int i = 0; i < list.Count; i++)
25 {
26 Console.WriteLine("搜索詞:" + list[i]);
27 Console.WriteLine("結果:");
28 Searcher(list[i]);
29 Console.WriteLine("-----------------------------------");
30 }
31 }
32
33 /**//// <summary>
34 /// 搜索
35 /// </summary>
36 /// <param name="querystring">搜索輸入</param>
37 private void Searcher(string querystring)
38 {
39 Analyzer analyzer = new StandardAnalyzer();
40 IndexSearcher searcher = new IndexSearcher("IndexDirectory");
41 QueryParser parser = new QueryParser("content", analyzer);
42 Query query = parser.Parse(querystring);
43 Hits hits = searcher.Search(query);
44 for (int i = 0; i < hits.Length(); i++)
45 {
46 Document doc = hits.Doc(i);
47
48 Console.WriteLine(doc.Get("title") + "_得分:" + hits.Score(i).ToString("f2"));
49 }
50 }
51
52/**//// <summary>
53/// 索引數據
54/// </summary>
55private void Index()
56{
57 Analyzer analyzer = new StandardAnalyzer();
58 IndexWriter writer = new IndexWriter("IndexDirectory", analyzer, true);
59 AddDocument(writer, "微軟Office 14即將展開Alpha測試", @"據國外網站消息,軟件巨頭微軟可能即將展開Office 14的Alpha測試,據消息來源聲稱,微軟下一版Office的Alpha測試日期可能在11月或12月。
60
61 微軟商業智能團隊的Hayley Rixon表示,根據技術檢測程序(TAP),他們即將展開OPPS功能進行檢測和分析。
62
63 其中OPPS(Office性能優化服務)是Office 14中的一個組成部分,可對商業業績進行分析。據稱OPPS Alpha項目將在8月28日發佈,而其他Office 14功能的詳情微軟則沒有透露。
64
65 這些內容最早公佈於Rixon的博客,不過隨後該頁面即被移除。 ", 1.0f);
66 AddDocument(writer, "IBM和微軟將測試雲計算的新的極限", @"[計世網消息](胡楊 編譯) IBM iDataPlex服務器陣列將作爲微軟Windows高性能集羣操作系統的測試硬件。IBM和微軟將聯合測試高性能計算和雲計算領域的新的極限。
67
68 IBM在6月27日宣佈,微軟將是其iDataPlex服務器陣列的第一個客戶。IBM是在今年4月首次推出這個x86服務器系統的,主要是用於建立運計算、Web 2.0應用程序和高性能計算的企業基礎設施。
69
70 在這次合作中,微軟Windows服務器部門計劃使用一個全部安裝iDataPlex系統的數據中心測試和評定微軟Windows HPC Server 2008高性計算機能集羣操作系統。多年以來,高性能計算和超級計算領域一直由Linux佔統治地位。微軟期待着改變這種情況。微軟最近宣佈,它將幫助建造一個性能達到每秒68.5萬億次計算的超級計算機。
71
72 雖然微軟和IBM在某些領域的競爭非常激烈,但是,這兩家公司還需要相互合作。這個合作協議對於這兩家公司都有幫助。
73
74 對於微軟來說,這個合作交易將幫助微軟進入進入高性能計算和超級計算機領域。IBM的iDataPlex能夠讓微軟利用這個技術測試自己的操作系統。微軟計劃在公司總部附近的設施中安裝IBM iDataPlex系統。
75
76 爲了幫助進行高性能計算,IBM還使用英特爾Xeon四核5400處理器(時鐘速度爲3.0GHz)擴展了iDataPlex的性能,把IBM的一個新的135平方英尺的模塊數據中心的性能提高到了每秒145萬億次計算。
77
78 對於IBM來說,這筆交易將使iDataPlex的應用有一個良好的起步,從而爲IBM贏得更多的大客戶。IBM計劃大舉進入雲計算領域,獲得微軟、谷歌和雅虎等大客戶。 ", 1.0f);
79 AddDocument(writer, "谷歌測試人力翻譯服務 有利於推廣其支付平臺", @"據國外媒體報道,Google(谷歌)Blogscoped博客業務部門主管菲利浦·倫森 (Philipp Lenssen)近日證實,該公司已推出了一項人力翻譯服務。雖然目前該服務仍處於測試階段,但分析人士認爲,Google正式推出這項服務後,將有利於提高Google Checkout支付平臺的用戶數量。
80
81倫森稱,Google這項人力翻譯服務名稱爲“Google翻譯中心”,目前僅對特定測試者開放,但預計不久後將擴大測試範圍。Google人力翻譯服務的大致操作流程是:翻譯客戶首先把需要翻譯的材料提交到Google翻譯中心,該中心把相應材料交給專業翻譯人員;翻譯人員完成工作後,再由Google翻譯中心轉交給翻譯客戶。
82
83據悉,Google翻譯中心可承接全球40種主要語言材料的翻譯任務。目前還不能肯定 Google是否會擔任客戶和譯者之間支付中間人,但如果Google這樣做,該公司肯定會向翻譯客戶推薦其Google Checkout支付平臺。除此之外,Google還可爲客戶和譯者提供在線存儲和管理工具,以方便他們對翻譯材料進行有序管理。
84
85分析人士還認爲,鑑於Google此前推出了在線百科全書服務Knol,或許Google將聘請專業翻譯人員把相應詞條翻譯成其他語言,從而使Knol用戶量成倍增長。而這種方式也符合Google“多多益善”的內容發展戰略。(編譯/中濤)
86", 1.0f);
87 AddDocument(writer, "最聰明的瀏覽器和操作系統", @"IQ聯盟維護着一個在線“60秒智商測試”。非常有意思的是,他們把測試結果和服務器上的日誌進行了一番統計。將城市和國家之類地理位置,測試者使用的操作系統/瀏覽器等結合起來,得出了 最聰明的瀏覽器和操作系統。結論是:最聰明的人使用的是未知平臺的Firefox(推測該平臺可能是MacOS-Intel),最笨的人使用的是IE on WinNT。他們還評出了世界最聰明的網站:第一是ScienceBlogs.com,第二是Slashdot.org。以及最聰明的國家:第一是摩爾多瓦,第二是泰國,中國的IQ爲83.77,排在66位。(這些結果會實時變動,現在最聰明的人使用的瀏覽器是Netscape on WinXP,最聰明的網站是test.qml.net)。
88", 1.0f);
89 writer.Optimize();
90 writer.Close();
91}
92 /**//// <summary>
93 /// 爲索引準備數據
94 /// </summary>
95 /// <param name="writer">索引實例</param>
96 /// <param name="content">需要索引的數據</param>
97 void AddDocument(IndexWriter writer, string title, string content, float boost)
98 {
99 Document document = new Document();
100 document.Add(new Field("title", title, Field.Store.YES, Field.Index.TOKENIZED));
101 document.Add(new Field("content", content, Field.Store.YES, Field.Index.TOKENIZED));
102 document.SetBoost(boost);
103 writer.AddDocument(document);
104 }
105 }
106}
OK,測試一下。
搜索詞:測試
結果:
最聰明的瀏覽器和操作系統_得分:0.17 //第四條記錄,字數最少
微軟Office 14即將展開Alpha測試_得分:0.14 //第一條記錄,字數和第三條相差不大
谷歌測試人力翻譯服務 有利於推廣其支付平臺_得分:0.13 //第三條記錄,和第一條記錄字數差不太多
IBM和微軟將測試雲計算的新的極限_得分:0.12 //第二條記錄,字數最多
-----------------------------------
可以看出,文檔長度,測試都有一定的影響。現在試着把分少的往高調。把第二條記錄增加0.1的權重。
搜索詞:測試
結果:
最聰明的瀏覽器和操作系統_得分:0.17
IBM和微軟將測試雲計算的新的極限_得分:0.15
微軟Office 14即將展開Alpha測試_得分:0.14
谷歌測試人力翻譯服務 有利於推廣其支付平臺_得分:0.13
-----------------------------------
暈倒,怎麼上面兩條也變掉了?那是因爲Lucene.Net中權重最小的文檔是計算其他文檔的一個基礎。其它文檔的分是以這個爲基礎,算出來的。因此改變最小的會影響好多個。不過這個影響現在並沒有影響排序。而再加0.1,就變成了:
搜索詞:測試
結果:
最聰明的瀏覽器和操作系統_得分:0.17
IBM和微軟將測試雲計算的新的極限_得分:0.15
微軟Office 14即將展開Alpha測試_得分:0.14
谷歌測試人力翻譯服務 有利於推廣其支付平臺_得分:0.13
-----------------------------------
跑到第二位去了。可見每增加0.1,會對結果造成很大的變動。而且干擾似乎也不是太大,看來0.1就夠了。現在試試把權重還原,然後調整第一條記錄的權重。增加0.1後變成:
搜索詞:測試
結果:
微軟Office 14即將展開Alpha測試_得分:0.17
最聰明的瀏覽器和操作系統_得分:0.17
谷歌測試人力翻譯服務 有利於推廣其支付平臺_得分:0.13
IBM和微軟將測試雲計算的新的極限_得分:0.12
-----------------------------------
下面的基礎值又回去了,而第一條也跑到第一位去了。
現在假設我要把第二條記錄調到第一位,其他地方權重全部還原。把第一第三條記錄對調一下。嘿嘿,我設置個30,肯定能到第一位了吧!測試結果:
搜索詞:測試
結果:
IBM和微軟將測試雲計算的新的極限_得分:1.00
最聰明的瀏覽器和操作系統_得分:0.04
微軟Office 14即將展開Alpha測試_得分:0.04
谷歌測試人力翻譯服務 有利於推廣其支付平臺_得分:0.03
-----------------------------------
是到第一位去了,不過其他文檔的得分都快變成0了。原來,在Lucene.Net中,文檔的最高評分就是1。如果一旦有文檔到了1,那麼其他文檔都會根據這個1的含金量進行調整。比如你把它的權重調成10000,那麼其他的都會變成0,但這並不會影響排序。你要有耐心,一點點調試,就會看到,在文檔分接近1的過程中,其他文檔的分不會發生改變,而一旦到了1還有加,其他的文檔分都會變低。永遠不會有兩個文檔評分都到1。
現在再來試試完全匹配。把第四條記錄的內容就換成測試兩個字。那麼它的評分會高達0.97分。其他值一般需要權重調正到8,才能和它抗衡。調整0.1就會對索引結果產生很大影響,如果設置權重,一般是按一套規則來做的,如果,大家都設置很大的數字,得分就會都很高,對於有時候需要給你的廣告客戶設置個第一位置來說,就容易產生混亂。混亂的問題呆會再說,現在要說的是字數少的評分太高的問題。有兩個辦法解決,一個就是降低字數過少內容的權重,但是注意不要設置爲0,設置爲0就認爲是沒有包含查詢關鍵字了;另一個辦法就是修改評分。修改評分等說到搜索的時候再來講。
現在再來看看剛纔說到的混亂問題,這個問題很重要。如果你要設置一個文檔在搜索一個關鍵字的時候在第一位,你設置了它很高的權重,那麼問題也來了,對於其他詞,其它它包含的詞,它也會跑到前面去。看來把文檔的權重設置太高也不好,個人認爲以0.1爲單位就足夠了,當然對於一些應用需要自己把握。比如,對於論壇帖子,一個回覆你給它加0.1分也不是個好主意。
以上的討論都是基於感性的認識,真正要研究,還需要對公式的增長曲線進行嚴格的分析才能下定論!
那要置頂要怎麼辦呢?這就要從另外一種設置權重的方法講起了。