Annotated Lucene:第一节 Lucene是什么

1           Lucene 是什么

Apache Lucene 是一个高性能( high-performance )的全能的全文检索( full-featured text search engine )的搜索引擎框架库,完全( entirely )使用 Java 开发。它是一种技术( technology ),适合于( suitable for )几乎( nearly )任何一种需要全文检索( full-text search )的应用,特别是跨平台( cross-platform )的应用。

 

Lucene 通过一些简单的接口( simple API )提供了强大的特征( powerful features ):

 

可扩展的高性能的索引能力( Scalable, High-Performance Indexing

ü         超过 20M / 分钟的处理能力( Pentium M 1.5GHz

ü         很少的 RAM 内存需求,只需要 1MB heap

ü         增量索引( incremental indexing )的速度与批量索引( batch indexing )的速度一样快

ü         索引的大小粗略( roughly )为被索引的文本大小的 20-30%

强大的精确的高效率的检索算法( Powerful, Accurate and Efficient Search Algorithms

ü         分级检索( ranked searching )能力,最好的结果优先推出在前面

ü         很多强大的 query 种类: phrase queries, wildcard queries, proximity queries, range queries

ü         支持域检索( fielded searching ),如标题、作者、正文等

ü         支持日期范围检索( date-range searching

ü         可以按任意域排序( sorting by any field

ü         支持多个索引的检索( multiple-index searching )并合并结果集( merged results

ü         允许更新和检索( update and searching )并发进行( simultaneous

跨平台解决方案( Cross-Platform Solution

ü         Open Source 方式提供并遵循 Apache License ,允许你可以在即包括商业应用也包括 Open Source 程序中使用 Lucene

ü         100%-pure Java (纯 Java 实现)

ü         提供其他开发语言的实现版本并且它们的索引文件是兼容的

 

Lucene API 被分成( divide into )如下几种包( package

 

org.apache.lucene.analysis         定义了一个抽象的 Analyser API ,用于将 text 文本从一个 java.io.Reader 转换成一个 TokenStream ,即包括一些 Tokens 的枚举容器( enumeration )。一个 TokenStream 的组成( compose )是通过在一个 Tokenizer 的输出的结果上再应用 TokenFilters 生成的。一些少量的 Analysers 实现已经提供,包括 StopAnalyzer 和基于语法( gramar-based )分析的 StandardAnalyzer

org.apache.lucene.document      提供一个简单的 Document 类,一个 document 只不过包括一系列的命名了( named )的 Fields (域),它们的内容可以是文本( strings )也可以是一个 java.io.Reader 的实例。

org.apache.lucene.index              提供两个主要地饿类,一个是 IndexWriter 用于创建索引并添加文档( document ),另一个是 IndexReader 用于访问索引中的数据。

org.apache.lucene.search 提供数据结构( data structures )来呈现( represent )查询( queries ): TermQuery 用于单个的词( individual words ), PhraseQuery 用于短语, BooleanQuery 用于通过 boolean 关系组合( combinations )在一起的 queries 。而抽象的 Searcher 用于转变 queries 为命中的结果( hits )。 IndexSearcher 实现了在一个单独( single )的 IndexReader 上检索。

org.apache.lucene.queryParser          使用 JavaCC 实现一个 QueryParser

org.apache.lucene.store              定义了一个抽象的类用于存储呈现的数据 (storing persistent data) ,即 Directory (目录),一个收集器( collection )包含了一些命名了的文件( named files ),它们通过一个 IndexOutput 来写入,以及一个 IndexInput 来读取。提供了两个实现, FSDirectory 使用一个文件系统目录来存储文件,而另一个 RAMDirectory 则实现了将文件当作驻留内存的数据结构( memory-resident data structures )。

org.apache.lucene.util                 包含了一小部分有用( handy )的数据结构,如 BitVector PriorityQueue 等。

        

2           Hello World!

下面是一段简单的代码展示如何使用 Lucene 来进行索引和检索(使用 JUnit 来检查结果是否是我们预期的):

 

 1      //  Store the index in memory:
 2     Directory directory  =   new  RAMDirectory();
 3      //  To store an index on disk, use this instead:
 4      // Directory directory = FSDirectory.getDirectory("/tmp/testindex");
 5     IndexWriter iwriter  =   new  IndexWriter(directory, analyzer,  true );
 6     iwriter.setMaxFieldLength( 25000 );
 7     Document doc  =   new  Document();
 8     String text  =   " This is the text to be indexed. " ;
 9     doc.add( new  Field( " fieldname " , text, Field.Store.YES,
10         Field.Index.TOKENIZED));
11     iwriter.addDocument(doc);
12     iwriter.optimize();
13     iwriter.close();
14     
15      //  Now search the index:
16     IndexSearcher isearcher  =   new  IndexSearcher(directory);
17      //  Parse a simple query that searches for "text":
18     QueryParser parser  =   new  QueryParser( " fieldname " , analyzer);
19     Query query  =  parser.parse( " text " );
20     Hits hits  =  isearcher.search(query);
21     assertEquals( 1 , hits.length());
22      //  Iterate through the results:
23      for  ( int  i  =   0 ; i  <  hits.length(); i ++ {
24       Document hitDoc  =  hits.doc(i);
25       assertEquals( " This is the text to be indexed. " , hitDoc.get( " fieldname " ));
26     }

27     isearcher.close();
28     directory.close(); 

 

为了使用 Lucene ,一个应用程序需要做如下几件事:

1.          通过添加一系列 Fields 来创建一批 Documents 对象。

2.          创建一个 IndexWriter 对象,并且调用它的 AddDocument() 方法来添加进 Documents

3.          调用 QueryParser.parse() 处理一段文本( string )来建造一个查询( query )对象。

4.          创建一个 IndexReader 对象并将查询对象传入到它的 search() 方法中。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值