首页 »编程综合 » lucene更新索引:Lucene.Net 2.3.1开发介绍 3、索引( 4) »正文
lucene更新索引:Lucene.Net 2.3.1开发介绍 3、索引( 4)
来源: 发布时间:星期四, 2009年1月15日 浏览:32次 评论:0
4、索引对搜索排序 影响 搜索 时候 同 个搜索关键字和同 份索引 决定了 个结果 不但决定了结果 集合 也确定了结果 顺序 那个这个结果是如何得出来 ?这个顺序又是如何排 呢?这两个问题不是本节讨论 重点 但是这两个问题却关系到本节要讨论 索引对结果 影响问题 在不使用字段排序 情况下 Lucene.Net默认是按文档 得分来排序 这个公式看着很复杂 感觉像是大学时高数书上 那些个公式 其实说清楚了也简单 有关文档排序有几个要素: (1)、查询词在文档中出现 频率 就是 个文档中包含了几个查询词 然后再开个平方 这个很好理解; (2)、反转文档频率 这个复杂 点 影响它 有两个原因 个是包含查询词 文档总数 个是文档 整体数量 比如 现在 索引文件有1000个文档 而现在搜索 关键字“博客园” 能找到499个文档包含它 那么就会拿文档总数除以包含关键字 文档数 这里包含关键字 文档数加了1 是防止 个也没找到 出现除以0 情况 这样 在这个例子中 就会得到结果2 然后再对这个2进行log操作 操作完了再加1 这样就得到值了 可以看出 文档总数越多 包含关键字 文档越少 那么这个值就越大 (3)、权重 很多书上叫激励因子 我喜欢叫权重 这个就是我们索引 时候能够调整 值 本节也就是对这个分析 (4)、保有率 这个名字比较难起 我就照着城市汽车保有率起 个吧 意思呢就是 按照分词结果 个Field如果含有100个词 那么就会把100开平方 得到10 然后再拿1除以这个10 得到0.1 这里就不详细论述了 下面进入本节 重点 1、什么是索引 权重? 从上面看出 有4个部分影响了文档 得分 那么 它们是乘积关系 所以权重对文档排序影响很大 什么是权重呢?就是你可以根据文档内容 好坏 设置好 文档权重高 设置差 文档权重低 是 个调节排序 因子 而不用在搜索是按字段排序
2、如何调整权重? 在Lucene.Net中如何调整权重呢?在不修改评分公式 前提下 可以通过设置Boost来控制权重 值 这个过程在索引文档 时候就进行了 旦文档被写入 这个值就不可更改了 除非删了重新建 个 调整权重也有两种调法 来仔细分析下设置权重如何影响排序 2.1 Document boost 对以前 代码做个修改 变成代码2.1.1 代码2.1.1 1using ; 2using .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 11 Test 12{ 13 [TestFixture] 14 public StandardAnalyzerCaseTest 15 { 16 /**//// <summary> 17 /// 执行测试入口 18 /// </summary> 19 [Test] 20 public void SearcherTest 21 { 22 Index; 23 List<> list = List<> { "测试" }; 24 for ( 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="query">搜索输入</param> 37 private void Searcher( query) 38 { 39 Analyzer analyzer = StandardAnalyzer; 40 IndexSearcher searcher = IndexSearcher("IndexDirectory"); 41 QueryParser parser = QueryParser("content", analyzer); 42 Query query = parser.Parse(query); 43 Hits hits = searcher.Search(query); 44 for ( i = 0; i < hits.Length; i) 45 { 46 Document doc = hits.Doc(i); 47 48 Console.WriteLine(doc.Get("content") + "_得分:" + hits.Score(i).("f2")); 49 } 50 } 51 52 /**//// <summary> 53 /// 索引数据 54 /// </summary> 55 private void Index 56 { 57 Analyzer analyzer = StandardAnalyzer; 58 IndexWriter writer = IndexWriter("IndexDirectory", analyzer, true); 59 AddDocument(writer, "测试标题", "测试内容", 1.0f); 60 AddDocument(writer, "测试标题 2", "测试内容 2", 1.0f); 61 AddDocument(writer, "测试标题 3", "测试内容 3", 1.0f); 62 AddDocument(writer, "测试标题 4", "测试内容 4", 1.0f); 63 writer.Optimize; 64 writer.Close; 65 } 66 /**//// <summary> 67 /// 为索引准备数据 68 /// </summary> 69 /// <param name="writer">索引例子</param> 70 /// <param name="content">需要索引数据</param> 71 void AddDocument(IndexWriter writer, title, content, float boost) 72 { 73 Document document = Document; 74 document.Add( Field("title", title, Field.Store.YES, Field.Index.TOKENIZED)); 75 document.Add( Field("content", content, Field.Store.YES, Field.Index.TOKENIZED)); 76 document.SetBoost(boost); 77 writer.AddDocument(document); 78 } 79 } 80}
测试 输出: 搜索词:测试 结果: 测试内容_得分:0.68 测试内容 2_得分:0.68 测试内容 3_得分:0.68 测试内容 4_得分:0.68 ----------------------------------- 这个在预料的中 在得分相同 情况下 是按照加入 顺序排 现在把索引部分代码换成代码 2.1.2 代码2.1.2 1/**//// <summary> 2/// 索引数据 3/// </summary> 4private void Index 5{ 6 Analyzer analyzer = StandardAnalyzer; 7 IndexWriter writer = IndexWriter("IndexDirectory", analyzer, true); 8 AddDocument(writer, "测试标题", "测试内容111", 1.0f); 9 AddDocument(writer, "测试标题 2", "测试内容 211", 1.0f); 10 AddDocument(writer, "测试标题 3", "测试内容 31", 1.0f); 11 AddDocument(writer, "测试标题 4", "测试内容 4", 1.0f); 12 writer.Optimize; 13 writer.Close; 14} 测试结果: 搜索词:测试 结果: 测试内容 4_得分:0.68 测试内容111_得分:0.58 测试内容 211_得分:0.58 测试内容 31_得分:0.58 ----------------------------------- ----------------------------------- 数字部分都是同 个分词 所以前 3个都 样 这个也好理解 这样就理解了为什么 般文字越多 排得越后了 现在词 数量较少 改变数量对得分影响极大
现在对boost 值调整 下,变成代码2.1.3 代码2.1.3 1/**//// <summary> 2/// 索引数据 3/// </summary> 4private void Index 5{ 6 Analyzer analyzer = StandardAnalyzer; 7 IndexWriter writer = IndexWriter("IndexDirectory", analyzer, true); 8 AddDocument(writer, "测试标题", "测试内容111", 1.3f); 9 AddDocument(writer, "测试标题 2", "测试内容 211", 1.2f); 10 AddDocument(writer, "测试标题 3", "测试内容 31", 1.1f); 11 AddDocument(writer, "测试标题 4", "测试内容 4", 1.0f); 12 writer.Optimize; 13 writer.Close; 14} 测试结果: 搜索词:测试 结果: 测试内容111_得分:0.78 测试内容 211_得分:0.68 测试内容 31_得分:0.68 测试内容 4_得分:0.68 ----------------------------------- 似乎 调整得小了点 结果影响并不是很大 只有调成1.3 对结果造成了比较大 影响 是不是调成1.3以上就会对结果产生比较大 影响呢?来试试代码2.1.4 代码2.1.4 1/**//// <summary> 2/// 索引数据 3/// </summary> 4private void Index 5{ 6 Analyzer analyzer = StandardAnalyzer; 7 IndexWriter writer = IndexWriter("IndexDirectory", analyzer, true); 8 AddDocument(writer, "测试标题", "测试内容111", 1.3f); 9 AddDocument(writer, "测试标题 2", "测试内容 211", 1.4f); 10 AddDocument(writer, "测试标题 3", "测试内容 31", 1.5f); 11 AddDocument(writer, "测试标题 4", "测试内容 4", 1.6f); 12 writer.Optimize; 13 writer.Close; 14} 果然 尤其是文档含有词少 影响更加明显 评分结果: 搜索词:测试 结果: 测试内容 4_得分:0.97 测试内容 111_得分:0.78 测试内容 211_得分:0.78 测试内容 31_得分:0.78 ----------------------------------- 现在先对以上数据分析 下 不难看出 得分越高 对权重 敏感度越高 而相同 就会比较迟钝 这样 般达不到我们想要 目地 当然在文档索引过程中出现索引文档Field包含相同词数 文档估计也不是很多 那这样区分有什么意义呢?
相关文章
读者评论
发表评论
|
|