首页 »编程综合 » lucene更新索引:Lucene.Net 2.3.1开发介绍 3、索引( 4) »正文
lucene更新索引:Lucene.Net 2.3.1开发介绍 3、索引( 4)
来源: 发布时间:星期四, 2009年1月15日 浏览:32次 评论:0
4、索引对搜索排序 ![](/icons/85472de.gif) 影响 搜索 ![](/icons/85472de.gif) 时候 ![](/icons/85472dou.gif) 同 ![](/icons/85472yi.gif) 个搜索关键字和同 ![](/icons/85472yi.gif) 份索引 ![](/icons/85472dou.gif) 决定了 ![](/icons/85472yi.gif) 个结果 ![](/icons/85472dou.gif) 不但决定了结果 ![](/icons/85472de.gif) 集合 ![](/icons/85472dou.gif) 也确定了结果 ![](/icons/85472de.gif) 顺序 ![](/icons/85472dou2.gif) 那个这个结果是如何得出来 ![](/icons/85472de.gif) ?这个顺序又是如何排 ![](/icons/85472de.gif) 呢?这两个问题不是本节讨论 ![](/icons/85472de.gif) 重点 ![](/icons/85472dou.gif) 但是这两个问题却关系到本节要讨论 ![](/icons/85472de.gif) ![](/icons/85472dou.gif) 索引对结果 ![](/icons/85472de.gif) 影响问题 ![](/icons/85472dou2.gif) 在不使用字段排序 ![](/icons/85472de.gif) 情况下 ![](/icons/85472dou.gif) Lucene.Net默认是按文档 ![](/icons/85472de.gif) 得分来排序 ![](/icons/85472de.gif) ![](/icons/85472dou.gif) 这个公式看着很复杂 ![](/icons/85472dou.gif) 感觉像是大学时高数书上 ![](/icons/85472de.gif) 那些个公式 ![](/icons/85472dou.gif) 其实说清楚了也简单 ![](/icons/85472dou2.gif) 有关文档排序有几个要素: (1)、查询词在文档中出现 ![](/icons/85472de.gif) 频率 ![](/icons/85472dou.gif) 就是 ![](/icons/85472yi.gif) 个文档中包含了几个查询词 ![](/icons/85472dou.gif) 然后再开个平方 ![](/icons/85472dou.gif) 这个很好理解; (2)、反转文档频率 ![](/icons/85472dou.gif) 这个复杂 ![](/icons/85472yi.gif) 点 ![](/icons/85472dou2.gif) 影响它 ![](/icons/85472de.gif) 有两个原因 ![](/icons/85472dou.gif) ![](/icons/85472yi.gif) 个是包含查询词 ![](/icons/85472de.gif) 文档总数 ![](/icons/85472dou.gif) ![](/icons/85472yi.gif) 个是文档 ![](/icons/85472de.gif) 整体数量 ![](/icons/85472dou2.gif) 比如 ![](/icons/85472dou.gif) 现在 ![](/icons/85472de.gif) 索引文件有1000个文档 ![](/icons/85472dou.gif) 而现在搜索 ![](/icons/85472de.gif) 关键字“博客园” ![](/icons/85472dou.gif) 能找到499个文档包含它 ![](/icons/85472dou2.gif) 那么就会拿文档总数除以包含关键字 ![](/icons/85472de.gif) 文档数 ![](/icons/85472dou.gif) 这里包含关键字 ![](/icons/85472de.gif) 文档数加了1 ![](/icons/85472dou.gif) 是防止 ![](/icons/85472yi.gif) 个也没找到 ![](/icons/85472dou.gif) 出现除以0 ![](/icons/85472de.gif) 情况 ![](/icons/85472dou2.gif) 这样 ![](/icons/85472dou.gif) 在这个例子中 ![](/icons/85472dou.gif) 就会得到结果2 ![](/icons/85472dou2.gif) 然后再对这个2进行log操作 ![](/icons/85472dou.gif) 操作完了再加1 ![](/icons/85472dou2.gif) 这样就得到值了 ![](/icons/85472dou2.gif) 可以看出 ![](/icons/85472dou.gif) 文档总数越多 ![](/icons/85472dou.gif) 包含关键字 ![](/icons/85472de.gif) 文档越少 ![](/icons/85472dou.gif) 那么这个值就越大 ![](/icons/85472dou2.gif) (3)、权重 ![](/icons/85472dou.gif) 很多书上叫激励因子 ![](/icons/85472dou.gif) 我喜欢叫权重 ![](/icons/85472dou2.gif) 这个就是我们索引 ![](/icons/85472de.gif) 时候能够调整 ![](/icons/85472de.gif) 值 ![](/icons/85472dou2.gif) 本节也就是对这个分析 ![](/icons/85472dou2.gif) (4)、保有率 ![](/icons/85472dou2.gif) 这个名字比较难起 ![](/icons/85472dou.gif) 我就照着城市汽车保有率起 ![](/icons/85472yi.gif) 个吧 ![](/icons/85472dou2.gif) 意思呢就是 ![](/icons/85472dou.gif) 按照分词结果 ![](/icons/85472dou.gif) ![](/icons/85472yi.gif) 个Field如果含有100个词 ![](/icons/85472dou.gif) 那么就会把100开平方 ![](/icons/85472dou.gif) 得到10 ![](/icons/85472dou.gif) 然后再拿1除以这个10 ![](/icons/85472dou.gif) 得到0.1 ![](/icons/85472dou2.gif) 这里就不详细论述了 ![](/icons/85472dou.gif) 下面进入本节 ![](/icons/85472de.gif) 重点 ![](/icons/85472dou2.gif) 1、什么是索引 ![](/icons/85472de.gif) 权重? 从上面看出 ![](/icons/85472dou.gif) 有4个部分影响了文档 ![](/icons/85472de.gif) 得分 ![](/icons/85472dou.gif) 那么 ![](/icons/85472dou.gif) 它们是乘积关系 ![](/icons/85472dou.gif) 所以权重对文档排序影响很大 ![](/icons/85472dou2.gif) 什么是权重呢?就是你可以根据文档内容 ![](/icons/85472de.gif) 好坏 ![](/icons/85472dou.gif) 设置好 ![](/icons/85472de.gif) 文档权重高 ![](/icons/85472dou.gif) 设置差 ![](/icons/85472de.gif) 文档权重低 ![](/icons/85472dou.gif) 是 ![](/icons/85472yi.gif) 个调节排序 ![](/icons/85472de.gif) 因子 ![](/icons/85472dou.gif) 而不用在搜索是按字段排序 ![](/icons/85472dou2.gif)
2、如何调整权重? 在Lucene.Net中如何调整权重呢?在不修改评分公式 ![](/icons/85472de.gif) 前提下 ![](/icons/85472dou.gif) 可以通过设置Boost来控制权重 ![](/icons/85472de.gif) 值 ![](/icons/85472dou2.gif) 这个过程在索引文档 ![](/icons/85472de.gif) 时候就进行了 ![](/icons/85472dou.gif) ![](/icons/85472yi.gif) 旦文档被写入 ![](/icons/85472dou.gif) 这个值就不可更改了 ![](/icons/85472dou.gif) 除非删了重新建 ![](/icons/85472yi.gif) 个 ![](/icons/85472dou2.gif) 调整权重也有两种调法 ![](/icons/85472dou.gif) 来仔细分析下设置权重如何影响排序 ![](/icons/85472de.gif) ![](/icons/85472dou2.gif) 2.1 Document ![](/icons/85472de.gif) boost 对以前 ![](/icons/85472de.gif) 代码做个修改 ![](/icons/85472dou.gif) 变成代码2.1.1 ![](/icons/85472dou2.gif) 代码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![](/icons/85472kh.gif) 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![](/icons/85472kh.gif) 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}
测试 ![](/icons/85472dou.gif) 输出: 搜索词:测试 结果: 测试内容 _得分:0.68 测试内容 2_得分:0.68 测试内容 3_得分:0.68 测试内容 4_得分:0.68 ----------------------------------- 这个在预料的中 ![](/icons/85472dou.gif) 在得分相同 ![](/icons/85472de.gif) 情况下 ![](/icons/85472dou.gif) 是按照加入 ![](/icons/85472de.gif) 顺序排 ![](/icons/85472de.gif) ![](/icons/85472dou2.gif) 现在把索引部分代码换成代码 2.1.2 ![](/icons/85472dou2.gif) 代码2.1.2 1/**//// <summary> 2/// 索引数据 3/// </summary> 4private void Index![](/icons/85472kh.gif) 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 ----------------------------------- ----------------------------------- ![](/icons/85472yinwei.gif) 数字部分都是同 ![](/icons/85472yi.gif) 个分词 ![](/icons/85472dou.gif) 所以前 3个都 ![](/icons/85472yi.gif) 样 ![](/icons/85472dou.gif) 这个也好理解 ![](/icons/85472dou.gif) 这样就理解了为什么 ![](/icons/85472yi.gif) 般文字越多 ![](/icons/85472dou.gif) 排得越后了 ![](/icons/85472dou2.gif) 现在词 ![](/icons/85472de.gif) 数量较少 ![](/icons/85472dou.gif) 改变数量对得分影响极大 ![](/icons/85472dou2.gif)
现在对boost ![](/icons/85472de.gif) 值调整 ![](/icons/85472yi.gif) 下,变成代码2.1.3 ![](/icons/85472dou2.gif) 代码2.1.3 1/**//// <summary> 2/// 索引数据 3/// </summary> 4private void Index![](/icons/85472kh.gif) 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 ----------------------------------- 似乎 ![](/icons/85472dou.gif) 调整得小了点 ![](/icons/85472dou.gif) 结果影响并不是很大 ![](/icons/85472dou.gif) 只有调成1.3 ![](/icons/85472de.gif) 对结果造成了比较大 ![](/icons/85472de.gif) 影响 ![](/icons/85472dou.gif) 是不是调成1.3以上就会对结果产生比较大 ![](/icons/85472de.gif) 影响呢?来试试代码2.1.4 ![](/icons/85472dou2.gif) 代码2.1.4 1/**//// <summary> 2/// 索引数据 3/// </summary> 4private void Index![](/icons/85472kh.gif) 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} 果然 ![](/icons/85472dou.gif) 尤其是文档含有词少 ![](/icons/85472de.gif) ![](/icons/85472dou.gif) 影响更加明显 ![](/icons/85472dou.gif) 评分结果: 搜索词:测试 结果: 测试内容 4_得分:0.97 测试内容 ![](/icons/85472yi.gif) 111_得分:0.78 测试内容 211_得分:0.78 测试内容 31_得分:0.78 ----------------------------------- 现在先对以上数据分析 ![](/icons/85472yi.gif) 下 ![](/icons/85472dou.gif) 不难看出 ![](/icons/85472dou.gif) 得分越高 ![](/icons/85472de.gif) ![](/icons/85472dou.gif) 对权重 ![](/icons/85472de.gif) 敏感度越高 ![](/icons/85472dou.gif) 而相同 ![](/icons/85472de.gif) ![](/icons/85472dou.gif) 就会比较迟钝 ![](/icons/85472dou2.gif) 这样 ![](/icons/85472yi.gif) 般达不到我们想要 ![](/icons/85472de.gif) 目地 ![](/icons/85472dou2.gif) 当然在文档索引过程中出现索引文档Field包含相同词数 ![](/icons/85472de.gif) 文档估计也不是很多 ![](/icons/85472dou2.gif) 那这样区分有什么意义呢?
相关文章
读者评论
发表评论
|
|