Annotated Lucene:第一节 Lucene是什么

【转】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)的数据结构,如BitVectorPriorityQueue等。

        

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()方法中。

你可能感兴趣的:(Annotated Lucene:第一节 Lucene是什么)