我是Lucene的新手,在创建 用于查询文本文件集合的 简单代码时遇到一些问题。
我尝试了此示例,但与新版本的Lucene不兼容。
UDPATE: 这是我的新代码,但是仍然无法使用。
Lucene是一个相当大的主题,涉及很多类和方法,通常您必须至少了解一些基本概念才能使用它。如果您需要快速可用的服务,请改用Solr。如果您需要对Lucene的完全控制,请继续阅读。我将介绍一些代表它们的Lucene核心概念和类。(对于阅读如何在内存中读取文本文件的信息,例如,此文章)。
无论您要在Lucene中做什么(建立索引或搜索),都需要一个html" target="_blank">分析器。分析器的目标是标记化(分解为单词)并词干(以单词为基)输入文本。它还会抛出最常见的单词,例如“
a”,“
the”等。您可以找到超过20种语言的分析器,也可以使用SnowballAnalyzer并将语言作为参数传递。
要为英语创建SnowballAnalyzer实例,请执行以下步骤:
Analyzer analyzer = new SnowballAnalyzer(Version.LUCENE_30, "English");
如果您要为不同语言的文本建立索引,并希望自动选择分析器,则可以使用tika的LanguageIdentifier。
您需要将索引存储在某个地方。这样做有两种主要可能性:内存索引(易于尝试)和磁盘索引(最广泛使用)。
使用接下来的2行:
Directory directory = new RAMDirectory(); // RAM index storage
Directory 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 field
String content = contentsOfYourFile;
doc.add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED)); // adding content field
writer.addDocument(doc); // writing new document to the index
Field
构造函数采用字段名称,文本和 至少
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来源。
问题内容: 我想为查询建立索引 如果我有一个像下面这样的表 我想创建一个索引,以便能够高效地执行以下操作: 还有这个: 我也希望该表能够实时更新。 如何创建这样的索引?(我有一种需要索引的感觉,但是我对需要给它提供什么选择感到困惑) 我正在使用Oracle 10g。 问题答案: 我会用这个(将您的最小和最大长度设置为适当值) 这些参数在此处解释《Oracle文本参考》
问题内容: 如何使用Python 3搜索和替换文件中的文本? 这是我的代码: 输入文件: 当我在上面的输入文件中搜索并将“ ram”替换为“ abcd”时,它起了一种魅力。但是,反之亦然,即用“ ram”替换“ abcd”时,一些垃圾字符会保留在末尾。 用“ ram”代替“ abcd” 问题答案: fileinput已经支持就地编辑。stdout在这种情况下,它将重定向到文件:
我正在编写一种方法来搜索列表形式的文字文件,搜索用户输入的文字,但如果找到一个字母,程序将返回一个肯定的结果。例如,如果我搜索“f”,当没有单词时,它将返回字典中有一个单词“f”
注意: 我只使用“luceneresults”.ascx和.cs。 ----问题更新了,因为我缩小了问题的范围---- 我试图创建一组特定项的索引,用于Lucene搜索。 在web.config中,我指定了一个索引,该索引包含: 完整索引:
问题内容: 我正在尝试在名为“ abc”的字段中搜索“ efg” c是Collection对象。我没有任何结果。我究竟做错了什么? 问题答案: 您正在生成,但查询应如下所示: 因此,尝试将代码更新为: 请记住,要使用搜索,您需要指定一个索引。查阅说明如何使用该文档的文档:http : //docs.mongodb.org/manual/reference/operator/query/text/
问题内容: 我想检查字符串是否在文本文件中。如果是,请执行X。否则,请执行Y。但是,True由于某些原因,此代码始终返回。谁能看到错在哪里? 问题答案: 你一直得到的原因已经给出,因此我只提供另一个建议: 如果你的文件不是太大,则可以将其读取为字符串,然后使用它(比读取和检查每行更容易,并且通常更快): 另一个技巧:通过使用创建使用基础文件的“字符串状”对象(而不是读取内存中的整个文件),可以减轻