Lucene是一个相当大的主题,涉及很多类和方法,通常您必须至少了解一些基本概念才能使用它。如果您需要快速可用的服务,请改用Solr。如果您需要对Lucene的完全控制,请继续阅读。我将介绍一些代表它们的Lucene核心概念和类。(对于阅读如何在内存中读取文本文件的信息,例如,此文章)。
无论您要在Lucene中做什么(建立索引或搜索),都需要一个分析器。分析器的目标是标记化(分解为单词)并词干(以单词为基)输入文本。它还会抛出最常见的单词,例如“
a”,“
the”等。您可以找到超过20种语言的分析器,也可以使用SnowballAnalyzer并将语言作为参数传递。
要为英语创建SnowballAnalyzer实例,请执行以下步骤:
Analyzer analyzer = new SnowballAnalyzer(Version.LUCENE_30, "English");
如果您要为不同语言的文本建立索引,并希望自动选择分析器,则可以使用tika的LanguageIdentifier。
您需要将索引存储在某个地方。这样做有两种主要可能性:内存索引(易于尝试)和磁盘索引(最广泛使用)。
使用接下来的2行:
Directory directory = new RAMDirectory(); // RAM index storageDirectory directory = FSDirectory.open(new File("/path/to/index")); // disk index storage当您想要添加,更新或删除文档时,您需要IndexWriter:
IndexWriter writer = new IndexWriter(directory, analyzer, true, new IndexWriter.MaxFieldLength(25000));
任何文档(在您的情况下为文本文件)都是一组字段。要创建将保存有关文件信息的文档,请使用以下命令:
document doc = new document();String title = nameOfYourFile;doc.add(new Field("title", title, Field.Store.YES, Field.Index.ANALYZED)); // adding title fieldString content = contentsOfYourFile;doc.add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED)); // adding content fieldwriter.adddocument(doc); // writing new document to the indexField构造函数采用字段名称,文本和 至少
2个其他参数。首先是一个标志,显示Lucene是否必须存储此字段。如果等于,
Field.Store.YES您将有可能从索引中取回所有文本,否则将仅存储有关它的索引信息。
第二个参数显示Lucene是否必须索引该字段。使用
Field.Index.ANALYZED你要搜索的任何领域。
通常,您都使用上述两个参数。
IndexWriter完成工作后,别忘了关闭您的计算机:
writer.close();
搜索有点棘手。您将需要几个类:
Query并
QueryParser从字符串中进行Lucene查询,
IndexSearcher以进行实际搜索,
TopScoreDocCollector存储结果(将其
IndexSearcher作为参数传递)并
ScoreDoc遍历结果。下一个代码片段显示了这一切的组成方式:
IndexSearcher searcher = new IndexSearcher(directory);QueryParser parser = new QueryParser(Version.LUCENE_30, "content", analyzer);Query query = parser.parse("terms to search");TopScoreDocCollector collector = TopScoreDocCollector.create(HOW_MANY_RESULTS_TO_COLLECT, true);searcher.search(query, collector);ScoreDoc[] hits = collector.topDocs().scoreDocs;// `i` is just a number of document in Lucene. Note, that this number may change after document deletion for (int i = 0; i < hits.length; i++) { document hitDoc = searcher.doc(hits[i].doc); // getting actual document System.out.println("Title: " + hitDoc.get("title")); System.out.println("Content: " + hitDoc.get("content")); System.out.println();}注意
QueryParser构造函数的第二个参数-这是默认字段,即,如果未给出限定符则将搜索的字段。例如,如果查询为“
title:term”,Lucene将在所有文档的“ title”字段中搜索单词“ term”,但是如果查询仅为“ term”,则将在默认字段中搜索,
-“内容”。有关更多信息,请参见Lucene查询语法。
QueryParser也将分析器作为最后一个参数。该分析器必须与用于索引文本的分析器相同。
您必须知道的最后一件事是
TopScoreDocCollector.create第一个参数。它只是一个数字,代表您要收集多少个结果。例如,如果它等于100,Lucene将仅收集第一个(按分数计)100个结果,其余收集。这只是一种优化行为-
您可以收集最佳结果,如果您对结果不满意,则可以重复搜索更大的数目。
最后,不要忘记关闭搜索器和目录以不丢失系统资源:
searcher.close();directory.close();
编辑: 另请参见IndexFiles
Demo类从Lucene的3.0来源。



