个人工具
名字空间
变换
操作

Lucene入门使用

来自站长百科
跳转到: 导航, 搜索

目录

Lucene的下载和配置

1、Lucene的下载

lucene在jakarta项目中的发布主页:http://jakarta.apache.org/lucene/docs/index.html。

2、lucene的配置 首先请确定你的机子已经进行了Java使用环境的基本配置,即确保在某个平台下能够运行java源代码,否则请查阅相关文档进行配置。

接下来进入lucene的配置:

普通使用者:在环境变量的CLASSPATH中添加lucene的位置。比如:“D:\java \lucene-1.4-final\lucene-1.4-final.jar;”。

Jbuilder使用者:在“Project”--“Project Properties”--“Required Libraries”进行添加。

Jsp使用者:也可以直接将lucene-1.4-final.jar文件放到\WEB-INF\classes下。

Lucene 的范例(Demo )

1、Demo说明

可以得到的Demo包括:lucene-demos-1.4-final、XMLIndexingDemo,lucene-demos-1.4-final中包括对普通文件和html文件的两种索引,XMLIndexingDemo针对xml文件的索引。他们的区别主要在于:对普通文件进行索引时只要对文件的全文进行索引,而针对html、xml文件时,对标签类型不能进行索引,在实现上:html、xml的索引需要额外的数据流分析器,以分析哪些内容有用哪些无用。因此,在后两者实现上,索引的时间额外开支,甚至超过索引本身时间,而检索时间没有区别。

以上Demo中,lucene-demos-1.4-final自带于lucene-1.4-final.zip中,XMLIndexingDemo的下载地址: http://cvs.apache.org/viewcvs.cgi/jakarta-lucene-sandbox/contributions/XML-Indexing-Demo/

2、Demo的运行

首先将demo.jar的路径添加如环境变量的CLASSPATH中,例如:“D:\java\lucene-1.4-final\lucene-demos-1.4-final.jar;”,同时确保已经添加lucene-1.4-final.jar。

然后进行文件的全文索引,在dos控制台中,输入命令“java org.apache.lucene.demo.IndexFiles {full-path-to-lucene}/src”,后面的路径为所要进行索引的文件夹,例如:“java org.apache.lucene.demo.IndexFiles c:\test”。

接着对索引进行检索,敲入“java org.apache.lucene.demo.SearchFiles”,在提示“Query:”后输入检索词,程序将进行检索列出检索得到的结果(检索词出现的文件路径)。 其他Demo的运行请参考\docs\demo.html。

在运行Demo后请阅读Demo的源代码以便深入学习。

利用Lucene进行索引

进行lucene的熟悉后,我们将学习如何使用Lucene。

一段索引的应用实例:

   //需要捕捉IOException异常
   //建立一个IndexWriter,索引保存目录为“index”
   String[] stopStrs = {
       "他奶奶的", "fuck"}; 
   StandardAnalyzer analyzer = new StandardAnalyzer(stopStrs);
   IndexWriter writer = new IndexWriter("index", analyzer, true);
   
   //添加一条文档
   Document doc = new Document();
   doc.add(Field.UnIndexed("id", "1"));//“id”为字段名,“1”为字段值
   doc.add(Field.Text("text", "fuck,他奶奶的,入门与使用"));
   writer.addDocument(doc);
   
   //索引完成后的处理
   writer.optimize();
   writer.close();

看完这段实例后,我们开始熟悉lucene的使用:

1、Lucene的索引接口

在学习索引的时候,首先需要熟悉几个接口:

  • 1.1、分析器Analyzer

分析器主要工作是筛选,一段文档进来以后,经过它,出去的时候只剩下那些有用的部分,其他则剔除。而这个分析器也可以自己根据需要而编写。

org.apache.lucene.analysis.Analyzer:这是一个虚构类,以下两个借口均继承它而来。

org.apache.lucene.analysis.SimpleAnalyzer:分析器,支持最简单拉丁语言。

org.apache.lucene.analysis.standard.StandardAnalyzer:标准分析器,除了拉丁语言还支持亚洲语言,并在一些匹配功能上进行完善。在这个接口中还有一个很重要的构造函数:

StandardAnalyzer(String[] stopWords),可以对分析器定义一些使用词语,这不仅可以免除检索一些无用信息,而且还可以在检索中定义禁止的政治性、非法性的检索关键词。

  • 1.2 IndexWriter

IndexWriter的构造函数有三种接口,针对目录Directory、文件File、文件路径String三种情况。

例如IndexWriter(String path, Analyzer a, boolean create),path为文件路径,a为分析器,create标志是否重建索引(true:建立或者覆盖已存在的索引,false:扩展已存在的索引。)

Lucene FirstUse1.jpg

I ndexWriter为了减少大量的io维护操作,在每得到一定量的索引后建立新的小索引文件(笔者测试索引批量的最小单位为10),然后再定期将它们整合到一个索引文件中,因此在索引结束时必须进行wirter. optimize(),以便将所有索引合并优化。

  • 1.3 org.apache.lucene.document

以下介绍两种主要的类:

a)org.apache.lucene.document.Document:

Document文档类似数据库中的一条记录,可以由好几个字段(Field)组成,并且字段可以套用不同的类型(详细见b)。Document的几种接口:

Lucene FirstUse2.jpg

b)org.apache.lucene.document.Field

即上文所说的“字段”,它是Document的片段section。

Field的构造函数: Field(String name, String string, boolean store, boolean index, boolean token)。

Indexed:如果字段是Indexed的,表示这个字段是可检索的。

Stored:如果字段是Stored的,表示这个字段的值可以从检索结果中得到。

Tokenized:如果一个字段是Tokenized的,表示它是有经过Analyzer转变后成为一个tokens序列,在这个转变过程tokenization中,Analyzer提取出需要进行索引的文本,而剔除一些冗余的词句(例如:a,the,they等,详见org.apache.lucene.analysis.StopAnalyzer.ENGLISH_STOP_WORDS和org.apache.lucene.analysis.standard.StandardAnalyzer(String[] stopWords)的API)。

Token是索引时候的基本单元,代表一个被索引的词,例如一个英文单词,或者一个汉字。因此,所有包含中文的文本都必须是Tokenized的。

Field的几种接口:

Lucene FirstUse3.jpg

利用Lucene进行检索

1、 一段简单的检索代码

   //需要捕捉IOException,ParseException异常
   //处理检索条件
   Query query = QueryParser.parse("入门", "text", analyzer);
   //检索
   Searcher searcher = new IndexSearcher("./index");//"index"指定索引文件位置
   Hits hits = searcher.search(query);
   //打印结果值集
   for (int i = 0; i < hits.length(); i++) {
     Document doc = hits.doc(i);
     String id = doc.get("id");
     System.out.println("found " + "入门" + " on the id:" + id);
   }

2、利用Lucene的检索接口

  • 2.1 Query与QueryParser

主要使用方法:

QueryParser .parse(String query, String field, Analyzer analyzer),例如:

Query query = QueryParser.parse("入门", "text", analyzer);

"入门"为检索词, "text"为检索的字段名, analyzer为分析器

  • 2.2 Hits与Searcher

Hits的主要使用接口:

Lucene FirstUse4.jpg

Lucene的其他使用

1、Lucene 的索引修改

下面给出一段修改索引的代码,请根据Lucene的API解读:

 /**
  * 对已有的索引添加新的一条索引
  * @param idStr String:要修改的id
  * @param doc Document:要修改的值
  */
 public void addIndex(String idStr, String valueStr) {
   StandardAnalyzer analyzer = new StandardAnalyzer();
   IndexWriter writer = null;
   try {
     writer = new IndexWriter(indexPath, analyzer, false);
     writer.mergeFactor = 2; //修正lucene 1.4.2 bug,否则不能正确反映修改
     Document doc = new Document();
     doc.add(Field.UnIndexed("id", idStr));//“id”为字段名,“1”为字段值
     doc.add(Field.Text("text", valueStr));
     writer.addDocument(doc);
     writer.optimize();
     writer.close();
   }
   catch (IOException ioe) {
     ioe.printStackTrace();
   }
 }
 /**
  * 删除索引
  *
  * @param idStr String
  */
 public void deleteIndex(String idStr) {
   try {
     Directory dirt = FSDirectory.getDirectory(indexPath, false);
     IndexReader reader = IndexReader.open(dirt);
     Term term = new Term("text", idStr);
     reader.delete(term);
     reader.close();
     dirt.close();
   }
   catch (IOException ioe) {
     ioe.printStackTrace();
   }
 }


2、Lucene 的检索结果排序

Lucene的排序主要是对org.apache.lucene.search.Sort的使用。Sort可以直接根据字段Field生成,也可以根据标准的SortField生成,但是作为Sort的字段,必须符合以下的条件:唯一值以及Indexed。可以对Integers, Floats, Strings三种类型排序。

对整数型的ID检索结果排序只要进行以下的简单操作:

 Sort sort = new Sort("id");
 Hits hits = searcher.search(query, sort);

用户还可以根据自己定义更加复杂的排序,详细请参考API。

总结

Lucene给java的全文索引检索带来了非常强大的力量,以上仅对Lucene进行简单的入门说明。

参考来源

参考来源

留言