论坛首页 Java企业应用论坛

Lucene 3.0 原理与代码分析

浏览 34603 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-02-25  
对了楼主,
Lucene in action 第二版最后一章有一个关于LUCENE的项目,但是我找到了很版本的PDF的这本书,最后一章都删除了,楼主你能找到不?
0 请登录后投票
   发表时间:2010-02-25  
Document doc = new Document();
			//创建Field对象,并放入doc对象中
			doc.add(new Field("filename", "Java编程和Java企业应用 Lucene 3.0 原理与代码分析", 
								Field.Store.YES, Field.Index.ANALYZED));
			doc.add(new Field("indexDate",DateTools.dateToString(new Date(), DateTools.Resolution.DAY),Field.Store.YES,Field.Index.NOT_ANALYZED));
			//写入IndexWriter
			indexWriter.addDocument(doc);

当addDocument到indexWriter之后,怎么看分词的情况?

比如说:
Java/编程/和/Java/企业/应用/Lucene 3.0 /原理/与/代码/分析 /代码分析/企业应用
0 请登录后投票
   发表时间:2010-02-26  
langhua9527 写道
Document doc = new Document();
			//创建Field对象,并放入doc对象中
			doc.add(new Field("filename", "Java编程和Java企业应用 Lucene 3.0 原理与代码分析", 
								Field.Store.YES, Field.Index.ANALYZED));
			doc.add(new Field("indexDate",DateTools.dateToString(new Date(), DateTools.Resolution.DAY),Field.Store.YES,Field.Index.NOT_ANALYZED));
			//写入IndexWriter
			indexWriter.addDocument(doc);

当addDocument到indexWriter之后,怎么看分词的情况?

比如说:
Java/编程/和/Java/企业/应用/Lucene 3.0 /原理/与/代码/分析 /代码分析/企业应用


您好,有关分词我想到得有以下几种方法:


1. 有个工具luke(http://www.getopt.org/luke/),能够查看索引。如果使用的分词器为org.apache.lucene.analysis.cjk.CJKAnalyzer,则打开索引后在Overview里面可以看到所有的Term,如下图,可以看到分词结果为"java 编程 程和 java 企业 业应 应用 lucene 3 0 原理 理与 与代 代码 码分 分析"


然而此种方法的问题是,现在luke仅仅支持到2.9,并不支持3.0的索引,因而要想看到分词结果,必须用2.9建立索引,用luke打开查看。
由于分词结果仅仅和分词器有关系,如果分词器在两个版本中没有太大变化,索引从2.9中看到的分词结果基本能够反映3.0中的分词情况。
如果非要看3.0中的分词器的效果,可以将分词器移到2.9的代码中,然后用它建立索引后查看。


2. 如果每次检验分词结果都要重建索引比较麻烦,可以使用luke中search这一栏,在Enter search expression here:输入"Java编程和Java企业应用 Lucene 3.0 原理与代码分析",注意一定要引号引起来,然后再Analyzer to use for query parsing中选择适当的分词器,比如选择org.apache.lucene.analysis.cjk.CJKAnalyzer,点击search,则在Query details里面显示的就是分词结果:filename:"java 编程 程和 java 企业 业应 应用 lucene 3 0 原理 理与 与代 代码 码分 分析"

因为索引阶段和搜索阶段的相同分词器的分词结果是一样的。



3. 如果在代码中查看,可以写如下代码:

    File indexDir = new File("TestIndexingAnalyzer");
    IndexWriter writer = new IndexWriter(FSDirectory.open(indexDir), new CJKAnalyzer(Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED);

    Document doc = new Document();
    // 创建Field对象,并放入doc对象中
    doc.add(new Field("filename", "Java编程和Java企业应用 Lucene 3.0 原理与代码分析", Field.Store.YES, Field.Index.ANALYZED));
    doc.add(new Field("indexDate", DateTools.dateToString(new Date(), DateTools.Resolution.DAY), Field.Store.YES, Field.Index.NOT_ANALYZED));
    // 写入IndexWriter
    writer.addDocument(doc);
    writer.close();
    
    IndexReader reader = IndexReader.open(FSDirectory.open(indexDir));
    //TermEnum是用来枚举所有分好的Term的
    TermEnum tm = reader.terms();
    while(tm.next()){
      System.out.println(tm.term());
    }



结果为:
filename:0
filename:3
filename:java
filename:lucene
filename:与代
filename:业应
filename:代码
filename:企业
filename:分析
filename:原理
filename:应用
filename:理与
filename:码分
filename:程和
filename:编程
indexDate:20100225

也可以看得出分词结果。
  • 大小: 43.5 KB
  • 大小: 41.2 KB
0 请登录后投票
   发表时间:2010-02-26  
看了第一篇文章,太棒了,绝对要评为精华的啊,可惜可惜了
0 请登录后投票
   发表时间:2010-02-26  
写的太好了,讲的很明了,楼主辛苦了
0 请登录后投票
   发表时间:2010-02-26  
楼主灰常厚道的说,可以拿去出版了,JE应该效仿一下天涯的煮酒啊
0 请登录后投票
   发表时间:2010-03-01  
对楼主还是挺钦佩的,能静心研究。(先前回复了“钦佩!钦佩!”给扣了30分,挺郁闷,有时本来就没有必要太多废话)
0 请登录后投票
   发表时间:2010-04-15  
呵呵,楼主及时雨,公司正在准备用这个,这篇文章好在给了一个参考。
0 请登录后投票
   发表时间:2010-04-20  
我断断续续看了好几天,今晚上终于把它看完了,顺便理了下思路,楼主加油!!!
0 请登录后投票
   发表时间:2010-06-09  
博主人格了得,乐以分享.学以致用!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics