专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » 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 Documentboost

  对以前代码做个修改变成代码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包含相同词数文档估计也不是很多那这样区分有什么意义呢?



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: