下载地址
https://lucene.apache.org/core/downloads.html
设置 CLASSPATH
下载最新的 Lucene 发行版,然后将其解压到工作目录。
您需要四个 JAR:Lucene JAR、queryparser JAR、通用分析 JAR 和 Lucene 演示 JAR。您应该在解压档案时创建的 core/ 目录中看到 Lucene JAR 文件——它应该被命名为 lucene-core-{version}.jar。您还应该在 queryparser、analysis/common/ 和 demo/ 下分别看到名为lucene-queryparser-{version}.jar、 lucene-analysis-common-{version}.jar和lucene-demo-{version}.jar的文件。
将所有这四个文件放在您的 Java CLASSPATH 中。
索引文件
让我们建立一个索引!假设您已正确设置 CLASSPATH,只需键入:
$java org.apache.lucene.demo.IndexFiles -docs {path-to-lucene}
这将生成一个名为index的子目录 ,其中包含所有 Lucene 源代码的索引。
要搜索索引类型:
$java org.apache.lucene.demo.SearchFiles
系统将提示您进行查询。输入乱码或编造的词(例如:“superca lifragilisticexpialidocious”)。您会看到 lucene 源代码中没有任何加工结果。现在尝试输入单词“string”。那应该返回一大堆文件。结果将在每十个结果处翻页,并询问您是否想要更多结果。
源码位置
此处讨论的文件直接链接到此文档中:
- IndexFiles.java:创建 Lucene 索引的代码。
- SearchFiles.java:用于搜索 Lucene 索引的代码。
索引文件
IndexFiles类创建了一个 Lucene 索引。让我们看看它是如何做到这一点的。
main()方法解析命令行参数,然后为实例化做准备 IndexWriter,打开 a Directory,实例化StandardAnalyzer and IndexWriterConfig。
-index
命令行参数的值是应该存储所有索引信息的文件系统目录的名称。如果使用-index命令行参数中给出的相对路径调用IndexFiles,或者如果未给出-index命令行参数,导致使用默认的相对索引路径“ index ”,则将创建索引路径作为当前工作目录的子目录(如果它不存在)。在某些平台上,索引路径可能创建在不同的目录中(例如用户的主目录)。
-docs
命令行参数值是包含要索引的文件的目录的位置。
-update
命令行参数告诉 IndexFiles如果索引已经存在,则不要删除它。当-update
没有给出时,IndexFiles将在索引任何文档之前首先清除 slate。
IndexWriterDirectory 使用 Lucene 将信息存储在索引中。除了 我们正在使用的实现之外,还有其他几个可以写入 RAM、数据库等的Directory子类。FSDirectory
LuceneAnalyzer 正在处理将文本分解为索引标记(也称为术语)的管道,并且可以选择对这些标记执行其他操作,例如向下大小写、同义词插入、过滤掉不需要的标记等。我们使用的分析器是StandardAnalyzer,它使用创建标记Unicode 标准附件#29中指定的 Unicode 文本分割算法中的分词规则; 将标记转换为小写;然后过滤掉停用词。停用词是常见的语言单词,例如文章(a、an、the 等)和其他可能对搜索价值较低的标记。应该注意的是,每种语言都有不同的规则,您应该为每种语言使用适当的分析器。Lucene 当前为许多不同的语言提供分析器(请参阅lucene/analysis/common/src/java/org/apache/lucene/analysis下的 javadocs )。
IndexWriterConfig 实例包含IndexWriter的所有配置。例如,我们根据-update命令行参数的值设置此处使用的OpenMode 。
再往下看,在 IndexWriter 实例化之后,您应该会看到 indexDocs() 代码。这个递归函数爬取目录并创建Document对象。Document只是一个数据对象,用于表示文件中的 文本内容以及它的创建时间和位置。这些实例被添加到IndexWriter中。如果 给出-update命令行参数, IndexWriterConfig OpenMode将设置为OpenMode.CREATE_OR_APPEND,而不是将文档添加到索引中,IndexWriter将 更新通过尝试查找具有相同标识符的已编入索引的文档(在我们的例子中,文件路径用作标识符),它们在索引中;如果存在,将其从索引中删除;然后将新文档添加到索引中。
搜索文件
SearchFiles
类非常简单。它主要与 IndexSearcher
, StandardAnalyzer
, (也用于IndexFiles类)和QueryParser. 查询解析器由一个分析器构成,该分析器用于以与解释文档相同的方式解释查询文本:查找单词边界、向下大小写和删除无用的单词,如“a”、“an”和“the”。该 Query对象包含 QueryParser传递给搜索器的结果。请注意,也可以在Query 不使用查询解析器的情况下以编程方式构造丰富的对象。查询解析器只是将 Lucene 查询语法解码为相应的 Query对象。
SearchFiles
使用 IndexSearcher.search(query,n)返回 TopDocs最大 n次命中的方法。结果打印在页面中,按分数(即相关性)排序。
使用向量嵌入
除了索引和搜索文本之外,IndexFiles 和 SearchFiles 还可以索引和搜索从该文本派生的数字向量,称为“嵌入”。此演示代码使用GloVe项目提供的预计算嵌入,这些嵌入位于公共领域。这里的字典是完整 GloVe 数据集的一小部分。它只包含玩具数据集中出现的单词,绝对不适合生产使用!如果您使用此代码为更大的文档集创建向量索引,则索引器将抛出异常,因为需要更完整的嵌入集才能获得合理的结果。