1、Lucene简介
Lucene是一个用Java写的全文索引引擎工具包,可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。
传统的数据库中的模糊查询 like %keyword% 是从数据库逐行匹配的,就像翻书一页页的查找需要的内容,所以效率也就自然很低了。而Lucene的全文索引指的是建立一个类似于科技索引一样的反向索引机制,将数据源排序存储,并提取出关键词并把关键词排好序,然后把关键词和文章映射好。所以检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组合过程。全文检索问题归结到最后就是一个排序问题。
可以从官网下载最新的Lucene:
http://lucene.apache.org/core/
2、简单的示例
以下是官网给的一个简单的例子:
public class demo1 {
public static void main(String[] args){
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);
// Store the index in memory:
Directory directory = new RAMDirectory();
// To store an index on disk, use this instead:
//Directory directory = FSDirectory.open("/tmp/testindex");
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);
IndexWriter iwriter;
try {
iwriter = new IndexWriter(directory, config);
Document doc = new Document();
String text = "This is the text to be indexed.";
doc.add(new Field("fieldname", text, TextField.TYPE_STORED));
iwriter.addDocument(doc);
iwriter.close();
// Now search the index:
DirectoryReader ireader = DirectoryReader.open(directory);
IndexSearcher isearcher = new IndexSearcher(ireader);
// Parse a simple query that searches for "text":
QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "fieldname", analyzer);
Query query = parser.parse("text");
ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;
System.out.println("hits num: " \+ hits.length);
// Iterate through the results:
for (int i = 0; i < hits.length; i++) {
Document hitDoc = isearcher.doc(hits[i].doc);
System.out.println("filename: " \+ hitDoc.get("fieldname"));
}
ireader.close();
directory.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
需要的Jar:
You need four JARs: the Lucene JAR(lucene-core-{version}.jar), the queryparser JAR(lucene-queryparser-{version}.jar), the common analysis JAR(lucene-analyzers-common-{version}.jar), and the Lucene demo JAR(lucene-demo-{version}.jar).
3、几个关键词的解释:
分析器(analyzer)与分词器(tokenizer)和过滤器(tokenfilter)
analyzer主要包含分词器跟过滤器,他的功能是:将分词器跟分析器进行合理的组合,使之产生对文本分词和过滤效果。因此,分析器使用分词和过滤器构成一个管道,文本在“滤过”这个管道之后,就成为可以进入索引的最小单位。
tokenizer主要用于对文本资源进行切分,将文本规则切分为一个个可以进入索引的最小单元 3〉tokenfilter主要对分词器切分的最小单位进入索引进行预处理,如:大写转小写,复数转单数,也可以复杂(根据语义改写拼写错误的单词)
4、Lucene基本的包结构:
Lucene API被分到若干个包中:
_1、org.apache.lucene.analysis:_定义了一个抽象的(分析器)Analyzer API,用来把文本从一个Reader输入流,转换为TokenStream(分词流),这个分词流是一个分词属性的列举。分析器使用分词和过滤器构成一个管道,文本在“滤过”这个管道之后,就成为可以进入索引的最小单位。Analyzer主要包含Tokenizer(分词器)跟(TokenFilters)过滤器。 analyzers-common包含了一系列分析器的实现,包括StopAnalyzer 和grammar-based StandardAnalyzer。
_2、org.apache.lucene.codecs:_提供了一个反向索引结构的抽象,根据不同的应用需求,提供了不同的具体实现。
_3、org.apache.lucene.document:_提供了一个简单Document类,一个Document由一系列的Field组成,Field的值可能是字符串或者java.io.Reader的一个实例。
_4、org.apache.lucene.index:_提供了两个主要的类:IndexWriter 用来创建并添加documents到索引,以及IndexReader 用来访问索引数据。
_5、org.apache.lucene.search:_提供特定的数据结构(Query)来进行查询(如TermQuery用来进行词条查询,PhraseQuery用来进行多关键词搜索,BooleanQuery用来进行“与或”搜索)并提供了IndexSearcher用来把查询转换为TopDocs。提供了一系列的QueryParser用来解析查询结构。
_6、org.apache.lucene.store:_定义了一个抽象类Directory来存储持久化数据,一个用来由IndexOutput执行写操作和由IndexInput执行读操作的文件集合,提供了多种实现,包括使用文件系统目录来存放文件的FSDirectory和用在内存中创建目录,并在目录中添加和删除文件的RAMDirectory。
_7、org.apache.lucene.util:_包含了一些便捷的数据结构和辅助类,如OpenBitSet和PriorityQueue。
5、在应用程序中使用Lucene的方法:
1、创建一个Document对象,并添加Field
2、创建一个IndexWrite,并通过其addDocument()方法把上一步创建的Document对象添加到里面
3、调用QueryParser.parse(String keywords)方法来创建一个查询对象Query
4、创建一个IndexSearcher,并把上一步的Query对象传入IndexSearcher的search()方法进行查询
查看官方说明:
http://lucene.apache.org/core/4_0_0/core/overview-summary.html