栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Lucene 3.0.2中索引和搜索文本文件?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Lucene 3.0.2中索引和搜索文本文件?

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 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来源。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/609861.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号