Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

释放双眼,带上耳机,听听看~!

原文:Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

话接上篇,继续来说权重对排序的影响。从上面的4个测试,只能说是有个直观的理解了。“哦,是!调整权重是能影响排序了,但是好像没办法来分析到底怎么调啊!”。似乎是这样,现在需要把问题放大,加大索引的内容。到博客园新闻区,用zzk找了4篇内容包含“测试”的文章。代码变成 2.1.5

Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
代码2.1.5

  1Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
using
 System;

  2
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
using
 System.Collections.Generic;

  3
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
using
 Lucene.Net.Analysis;

  4
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
using
 Lucene.Net.Analysis.Standard;

  5
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
using
 Lucene.Net.Documents;

  6
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
using
 Lucene.Net.Index;

  7
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
using
 Lucene.Net.QueryParsers;

  8
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
using
 Lucene.Net.Search;

  9
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
using
 NUnit.Framework;

 10
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 11
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
namespace
 Test

 12
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
{

 13
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)    [TestFixture]

 14
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)    
public
 
class
 StandardAnalyzerCaseTest

 15
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)    
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
{

 16
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
/**/
///
 

<summary>

 17
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
///
 执行测试的入口

 18
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
///
 

</summary>

 19Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
        [Test]

 20
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
public
 
void
 SearcherTest()

 21
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
{

 22
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            Index();

 23
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            List
<
string

 list 

 
new
 List
<
string

() 
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

"
测试
"
 }
;

 24
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            
for
 (
int
 i 

 
0
; i 
<
 list.Count; i
++
)

 25
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
{

 26
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)                Console.WriteLine(
"
搜索词:
"
 
+
 list[i]);

 27
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)                Console.WriteLine(
"
结果:
"
);

 28
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)                Searcher(list[i]);

 29
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)                Console.WriteLine(
"

"
);

 30
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            }

 31
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        }

 32
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 33
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
/**/
///
 

<summary>

 34
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
///
 搜索

 35
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
///
 

</summary>

 36
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
///
 
<param name="querystring">
搜索输入

</param>

 37Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
        
private
 
void
 Searcher(
string
 querystring)

 38
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
{

 39
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            Analyzer analyzer 

 
new
 StandardAnalyzer();

 40
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            IndexSearcher searcher 

 
new
 IndexSearcher(
"
IndexDirectory
"
);

 41
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            QueryParser parser 

 
new
 QueryParser(
"
content
"
, analyzer);

 42
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            Query query 

 parser.Parse(querystring);

 43
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            Hits hits 

 searcher.Search(query);

 44
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            
for
 (
int
 i 

 
0
; i 
<
 hits.Length(); i
++
)

 45
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
{

 46
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)                Document doc 

 hits.Doc(i);

 47
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 48
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)                Console.WriteLine(doc.Get(
"
title
"

+
 
"
_得分:
"
 
+
 hits.Score(i).ToString(
"
f2
"
));

 49
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            }

 50
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        }

 51
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 52
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
/**/
///
 

<summary>

 53
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
///
 索引数据

 54
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
///
 

</summary>

 55Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
private
 
void
 Index()

 56
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
{

 57
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)    Analyzer analyzer 

 
new
 StandardAnalyzer();

 58
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)    IndexWriter writer 

 
new
 IndexWriter(
"
IndexDirectory
"
, analyzer, 
true
);

 59
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)    AddDocument(writer, 
"
微软Office 14即将展开Alpha测试
"

@"
据国外网站消息,软件巨头微软可能即将展开Office 14的Alpha测试,据消息来源声称,微软下一版Office的Alpha测试日期可能在11月或12月。

 60
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 61
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)  微软商业智能团队的Hayley Rixon表示,根据技术检测程序(TAP),他们即将展开OPPS功能进行检测和分析。

 62
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 63
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)  其中OPPS(Office性能优化服务)是Office 14中的一个组成部分,可对商业业绩进行分析。据称OPPS Alpha项目将在8月28日发布,而其他Office 14功能的详情微软则没有透露。

 64
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 65
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)  这些内容最早公布于Rixon的博客,不过随后该页面即被移除。 
"

1.0f
);

 66
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)    AddDocument(writer, 
"
IBM和微软将测试云计算的新的极限
"

@"
[计世网消息](胡杨 编译) IBM iDataPlex服务器阵列将作为微软Windows高性能集群操作系统的测试硬件。IBM和微软将联合测试高性能计算和云计算领域的新的极限。

 67
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 68
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)  IBM在6月27日宣布,微软将是其iDataPlex服务器阵列的第一个客户。IBM是在今年4月首次推出这个x86服务器系统的,主要是用于建立运计算、Web 2.0应用程序和高性能计算的企业基础设施。

 69
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 70
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)  在这次合作中,微软Windows服务器部门计划使用一个全部安装iDataPlex系统的数据中心测试和评定微软Windows HPC Server 2008高性计算机能集群操作系统。多年以来,高性能计算和超级计算领域一直由Linux占统治地位。微软期待着改变这种情况。微软最近宣布,它将帮助建造一个性能达到每秒68.5万亿次计算的超级计算机。

 71
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 72
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)  虽然微软和IBM在某些领域的竞争非常激烈,但是,这两家公司还需要相互合作。这个合作协议对于这两家公司都有帮助。

 73
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 74
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)  对于微软来说,这个合作交易将帮助微软进入进入高性能计算和超级计算机领域。IBM的iDataPlex能够让微软利用这个技术测试自己的操作系统。微软计划在公司总部附近的设施中安装IBM iDataPlex系统。

 75
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 76
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)  为了帮助进行高性能计算,IBM还使用英特尔Xeon四核5400处理器(时钟速度为3.0GHz)扩展了iDataPlex的性能,把IBM的一个新的135平方英尺的模块数据中心的性能提高到了每秒145万亿次计算。

 77
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 78
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)  对于IBM来说,这笔交易将使iDataPlex的应用有一个良好的起步,从而为IBM赢得更多的大客户。IBM计划大举进入云计算领域,获得微软、谷歌和雅虎等大客户。 
"

1.0f
);

 79
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)    AddDocument(writer, 
"
谷歌测试人力翻译服务 有利于推广其支付平台
"

@"
据国外媒体报道,Google(谷歌)Blogscoped博客业务部门主管菲利浦·伦森 (Philipp Lenssen)近日证实,该公司已推出了一项人力翻译服务。虽然目前该服务仍处于测试阶段,但分析人士认为,Google正式推出这项服务后,将有利于提高Google Checkout支付平台的用户数量。

 80
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 81
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)伦森称,Google这项人力翻译服务名称为“Google翻译中心”,目前仅对特定测试者开放,但预计不久后将扩大测试范围。Google人力翻译服务的大致操作流程是:翻译客户首先把需要翻译的材料提交到Google翻译中心,该中心把相应材料交给专业翻译人员;翻译人员完成工作后,再由Google翻译中心转交给翻译客户。

 82
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 83
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)据悉,Google翻译中心可承接全球40种主要语言材料的翻译任务。目前还不能肯定 Google是否会担任客户和译者之间支付中间人,但如果Google这样做,该公司肯定会向翻译客户推荐其Google Checkout支付平台。除此之外,Google还可为客户和译者提供在线存储和管理工具,以方便他们对翻译材料进行有序管理。

 84
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

 85
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)分析人士还认为,鉴于Google此前推出了在线百科全书服务Knol,或许Google将聘请专业翻译人员把相应词条翻译成其他语言,从而使Knol用户量成倍增长。而这种方式也符合Google“多多益善”的内容发展战略。(编译/中涛) 

 86
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
"

1.0f
);

 87
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)    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
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
"

1.0f
);

 89
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)    writer.Optimize();

 90
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)    writer.Close();

 91
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)}

 92
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
/**/
///
 

<summary>

 93
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
///
 为索引准备数据

 94
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
///
 

</summary>

 95
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
///
 
<param name="writer">
索引实例

</param>

 96
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
///
 
<param name="content">
需要索引的数据

</param>

 97Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
        
void
 AddDocument(IndexWriter writer, 
string
 title, 
string
 content, 
float
 boost)

 98
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)
{

 99
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            Document document 

 
new
 Document();

100
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            document.Add(
new
 Field(
"
title
"
, title, Field.Store.YES, Field.Index.TOKENIZED));

101
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            document.Add(
new
 Field(
"
content
"
, content, Field.Store.YES, Field.Index.TOKENIZED));

102
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            document.SetBoost(boost);

103
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)            writer.AddDocument(document);

104
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)        }

105
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)    }

106
Lucene.Net 2.3.1开发介绍 —— 三、索引(五)}

 

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分也不是个好主意。

 

以上的讨论都是基于感性的认识,真正要研究,还需要对公式的增长曲线进行严格的分析才能下定论!

 

那要置顶要怎么办呢?这就要从另外一种设置权重的方法讲起了。

 

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索