Lucene-构建和安装基础示例程序
- 关于本文
- 关于示例程序
- 设置CLASSPATH环境变量
- 使用索引搜索
- 关于代码
- 核心代码
- 索引文件
- 搜索索引
关于本文
本文的目标是通过示例程序帮助你快速入门,了解基本的安装流程,和配置方法。
关于示例
示例程序演示了Lucene各种功能,以及如何嵌入到你的应用中。
设置CLASSPATH环境变量
首先,你需要下载最新的Lucene发布包,然后解压到一个目录中。
然后你会得到四个JAR包: lucene-core-{version}.jar、 lucene-queryparser-{version}.jar、 lucene-analyzers-common-{version}.jar、 lucene-demo-{version}.jar,把四个JAR包放入到CLASSPATH中。
使用索引搜索
假设你已经正确配置了CLASSPATH环境变量,接着为文件建立索引。
java org.apache.lucene.demo.IndexFiles -docs {path-to-lucene}
上面的命令生成一个叫index的子目录,里面包含了生成了所有Lucene源代码的索引。
建立完索引之后,通过下面的命令来使用索引搜索:
java org.apache.lucene.demo.SearchFiles
尝试搜索supercalifragilisticexpialidocious,你将会得到无结果,因为Lucene源代码中没有这个词。换一个词,如string,再试一次。然后得到了很多结果,每页十条返回,当然你也可以根据需要要求返回更多的结果。
关于代码
本文深入到命令行的背后–源代码,告诉你核心代码有哪些,在哪里,以及功能是什么,目的是为了使你知道如何在自己应用程序中集成Lucene。
核心代码
- IndexFiles.java:用于创建一个索引文件
- SearchFiles.java:用于搜索索引文件
索引文件
上面说到IndexFiles类用于创建索引文件,下面来看看它是如何做的。
IndexFiles的执行流程:
main()方法解析命令行参数,然后初始化IndexWriter,打开一个Directory,再初始化StandardAnalyzer和IndexWriterConfig。
IndexFiles的命令行参数:
- -index:指定了一个存储索引文件的目录路径,如果没有指定-index参数的值,则默认使用相对路径index,如果当前目录不存在,则新建一个。在某些平台上,默认index目录可能是在一个不同的目录中创建的,如用户目录。
- -docs:指定要建立索引为的文档路径。
- -update:指示IndexFiles不要删除那些已经存在的索引文件,如果没有这个参数,那么IndexFiles在建立索引之前首先清空索引文件。
IndexWriter使用Directory存储索引信息,Directory是一个抽象概念,并不一定是指文件系统上的一个目录,也可以是RAM或数据库等。在示例程序中用到的是FSDirectory,它存储的目的地是文件系统。
Analyzer是一个处理通道,通过把输入文本打散成一个个的单词,然后再在单词上做进一步的处理,如小写转换、同义词插入、过滤等操作。在示例程序中,使用的是StandardAnalyzer,它使用Unicode文本分隔算法(该算法定义在 Unicode Standard Annex #29中),然后转换成小写,并过滤停止词。Lucene只提供少数几种语言的分析器,定义在lucene/analysis/common/src/java/org/apache/lucene/analysis下。
IndexWriterConfig封装了IndexWriter的所有配置。
当IndexWriter初始化之后,接着调用indexDocs()方法来递归建立Document对象,然后再由IndexWriter序列化到文件中。Document对象是一个简单的数据对象,表示一个索引文件。如果使用了-update命令行参数,IndexWriterConifg的OpenMode将会被设置为OpenMode.CREATE_OR_APPEND,从而IndexWriter尝试根据标识符查找是否存在旧的索引文件,如果存在,则更新;如果不存在,则新建。
搜索索引
SearchFile类由三个组件组成:IndexSearcher、StandardAnalyzer和QueryParser。搜索用到的分词器与建立索引时适用的分词器必须是同一个,才能保证结果正确。QueryParser分析搜索词,产生一个查询对象Query,然后再传递给IndexSearcher进行搜索。
调用SearchFile的search(query,n)方法进行搜索,命中文档将按照分数从高到低排序,然后返回最高的前几文档。
知识链
参考
Lucene 7.4.0 demo API