0
点赞
收藏
分享

微信扫一扫

Apache Lucene 5.x版本 示例


Apache Lucene 5.x版本 示例

由于目前网上关于lucene的资料多是4.x或者更早版本的,5.x版本相比有较大的改动,为了方便学习5.x版本,本文对5.x的示例简单修改做个记录。

本文内容源自官方文档,在​​core/overview-summary.html​​上。

本文使用的具体版本是5.3.1,针对5.x版本都适用。

简单例子

Apache Lucene 是一个高性能并且功能全面的文本搜索引擎库,这里有一个如何使用Lucene进行索引和查询的简单例子。

public static void main(String[] args) throws IOException, ParseException {
Analyzer analyzer = new StandardAnalyzer();

//将索引存储到内存中
Directory directory = new RAMDirectory();
//如下想把索引存储到硬盘上,使用下面的代码代替
//Directory directory = FSDirectory.open(Paths.get("/tmp/testindex"));
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter iwriter = new IndexWriter(directory, config);

String[] texts = new String[]{
"Mybatis分页插件 - 示例",
"Mybatis 贴吧问答 第一期",
"Mybatis 示例之 复杂(complex)属性(property)",
"Mybatis极其(最)简(好)单(用)的一个分页插件",
"Mybatis 的Log4j日志输出问题 - 以及有关日志的所有问题",
"Mybatis 示例之 foreach (下)",
"Mybatis 示例之 foreach (上)",
"Mybatis 示例之 SelectKey",
"Mybatis 示例之 Association (2)",
"Mybatis 示例之 Association"
};

for (String text : texts) {
Document doc = new Document();
doc.add(new Field("fieldname", text, TextField.TYPE_STORED));
iwriter.addDocument(doc);
}
iwriter.close();

//读取索引并查询
DirectoryReader ireader = DirectoryReader.open(directory);
IndexSearcher isearcher = new IndexSearcher(ireader);
//解析一个简单的查询
QueryParser parser = new QueryParser("fieldname", analyzer);
Query query = parser.parse("foreach");
ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;
//迭代输出结果
for (int i = 0; i < hits.length; i++) {
Document hitDoc = isearcher.doc(hits[i].doc);
System.out.println(hitDoc.get("fieldname"));
}
ireader.close();
directory.close();
}

代码输出结果:

Mybatis 示例之 foreach (下)
Mybatis 示例之 foreach (上)

Lucene API 分成了下面几个包

​org.apache.lucene.analysis​

定义了从​​Reader​​​转换为​​TokenStream​​​的抽象​​Analyzer​​​API,主要就是分词器。提供了一些默认的实现,包含​​StopAnalyzer​​​和基于文法的​​StandardAnalyzer​​​。中文分词可以参考 中文分词库 IKAnalyzer。

​org.apache.lucene.codecs​

提供了一个抽象的编码和解码的倒排索引结构,还提供了一些不同的实现可以应用于不同的程序需求。

​org.apache.lucene.document​

提供了一个简单的​​Document​​​类。一个文档只是一组命名的字段,它的值可以是字符串或者​​Reader​​的实例。

​org.apache.lucene.index​

提供了两个主要的类:​​IndexWriter​​​用于创建和给文档添加索引,​​IndexReader​​用于访问索引数据。

​org.apache.lucene.search​

提供代表查询的数据结构(例如​​TermQuery​​​用于单独的关键字查询,​​PhraseQuery​​​用于短句,​​BooleanQuery​​​用于布尔联合查询)。
​​​IndexSearcher​​​将查询转换为​​TopDocs​​​。一些​​QueryParsers​​提供了从字符串或者xml生成查询结构的功能。

​org.apache.lucene.store​

定义了一个抽象类来存储持久化数据,​​Directory​​​这是一个由​​IndexOutput​​​和​​IndexInput​​​分别写和读取的指定文件的集合。提供了多个实现,包括​​FSDirectory​​​,这个实现使用文件系统目录来存储文件。还有​​RAMDirectory​​类实现了文件驻留在内存中的数据结构。

​org.apache.lucene.util​

包含了一些有用的数据结构和工具类,例如​​FixedBitSet​​​和​​PriorityQueue​​。

应用应该按下面的步骤使用Luncene

  1. 通过添加字段(​​Field​​)创建文档(​​Document​​);
  2. 创建​​IndexWriter​​,通过​​addDocument()​​方法添加文档(​​Document​​);
  3. 调用​​QueryParser.parser()​​方法从字符串生成查询对象;
  4. 创建​​IndexSearcher​​并通过​​search()​​方法进行查询。

最后

以上内容是Luncene中最基本的内容,关于上面每个包下面都还有一份详细的文档,本文后续可能会对这些内容做一些简单的介绍,如果大家需要用到Luncene,建议下载​​官方提供​​的下载,里面包含完整的文档内容。


举报

相关推荐

0 条评论