全文搜索Apache Lucene简介

在本教程中,我想谈谈Apache Lucene 。 Lucene是一个开源项目,提供基于Java的索引和搜索技术。 使用其API,很容易实现全文搜索 。 我将处理Lucene Java版本 ,但请记住,还有一个名为Lucene.NET的.NET端口,以及一些有用的子项目。

我最近阅读了有关该项目的精彩教程 ,但没有提供实际的代码。 因此,我决定提供一些示例代码来帮助您开始使用Lucene。 我们将构建的应用程序将允许您索引自己的源代码文件并搜索特定的关键字。

首先,让我们从其中一个Apache Download Mirrors下载最新的稳定版本。 我将使用的版本是3.0.1,所以我下载了lucene-3.0.1.tar.gz捆绑包(请注意,.tar.gz版本明显小于相应的.zip版本)。 解压缩tarball并找到lucene-core-3.0.1.jar文件,稍后将使用它。 此外,请确保在浏览器中打开Lucene API JavaDoc页面(文档也包含在压缩包中以供离线使用)。 接下来,设置一个新的Eclipse项目,假设其名称为“ LuceneIntroProject”,并确保在项目的类路径中包含上述JAR。

在开始运行搜索查询之前,我们需要构建一个索引,将针对该索引执行查询。 这将在名为IndexWriter的类的帮助下完成,该类是创建和维护索引的类。 IndexWriter接收Document作为输入,其中document是索引和搜索的单位。 每个Document实际上是一组Field ,每个字段都有一个名称和一个文本值。 要创建IndexWriter,需要使用分析器 。 此类是抽象的,我们将使用的具体实现是SimpleAnalyzer 。

已经说够了,让我们创建一个名为“ SimpleFileIndexer”的类,并确保包含一个主要方法。 这是此类的源代码:

package com.javacodegeeks.lucene;import java.io.File;
import java.io.FileReader;
import java.io.IOException;import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;public class SimpleFileIndexer {public static void main(String[] args) throws Exception {File indexDir = new File("C:/index/");File dataDir = new File("C:/programs/eclipse/workspace/");String suffix = "java";SimpleFileIndexer indexer = new SimpleFileIndexer();int numIndex = indexer.index(indexDir, dataDir, suffix);System.out.println("Total files indexed " + numIndex);}private int index(File indexDir, File dataDir, String suffix) throws Exception {IndexWriter indexWriter = new IndexWriter(FSDirectory.open(indexDir), new SimpleAnalyzer(),true,IndexWriter.MaxFieldLength.LIMITED);indexWriter.setUseCompoundFile(false);indexDirectory(indexWriter, dataDir, suffix);int numIndexed = indexWriter.maxDoc();indexWriter.optimize();indexWriter.close();return numIndexed;}private void indexDirectory(IndexWriter indexWriter, File dataDir, String suffix) throws IOException {File[] files = dataDir.listFiles();for (int i = 0; i < files.length; i++) {File f = files[i];if (f.isDirectory()) {indexDirectory(indexWriter, f, suffix);}else {indexFileWithIndexWriter(indexWriter, f, suffix);}}}private void indexFileWithIndexWriter(IndexWriter indexWriter, File f, String suffix) throws IOException {if (f.isHidden() || f.isDirectory() || !f.canRead() || !f.exists()) {return;}if (suffix!=null && !f.getName().endsWith(suffix)) {return;}System.out.println("Indexing file " + f.getCanonicalPath());Document doc = new Document();doc.add(new Field("contents", new FileReader(f)));        doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES, Field.Index.ANALYZED));indexWriter.addDocument(doc);}}

让我们来谈谈这个课程。 我们提供了索引的位置,即索引数据将保存在磁盘上的位置(“ c:/ index /”)。 然后,我们提供数据目录,即将递归扫描输入文件的目录。 为此,我选择了整个Eclipse工作区(“ C:/ programs / eclipse / workspace /”)。 由于我们只希望为Java源代码文件建立索引,因此我还添加了一个后缀字段。 您显然可以根据您的搜索需求调整这些值。 “索引”方法考虑了先前的参数,并使用IndexWriter的新实例来执行目录索引。 “ indexDirectory”方法使用一种简单的递归算法来扫描所有目录以查找带有.java后缀的文件。 对于每个符合条件的文件,将在“ indexFileWithIndexWriter”中创建一个新文档,并填充相应的字段。 如果您通过Eclipse将类作为Java应用程序运行,则输入目录将被索引,输出目录将如下图所示: 好的,我们完成了索引工作,让我们继续进行方程式的搜索部分。 为此,需要一个IndexSearcher类,它是实现主要搜索方法的类。 对于每次搜索,都需要一个新的Query对象(SQL可以使用SQL吗?),可以从QueryParser实例中获得该对象。 请注意,必须使用与创建索引相同的分析器类型来创建QueryParser,在我们的示例中,使用SimpleAnalyzer。 根据JavaDocs, Version也用作构造函数参数,并且是一个“被某些类用来在Lucene的各个发行版之间匹配版本兼容性”的类。 诸如此类的存在使我感到困惑,但是无论如何,让我们为应用程序使用适当的版本( Lucene_30 )。 由IndexSearcher执行搜索时,将返回TopDocs对象作为执行结果。 此类仅表示搜索结果,并允许我们检索ScoreDoc对象。 使用ScoreDocs,我们找到符合搜索条件的文档,然后从这些文档中检索所需的信息。 让我们看看所有这些都在起作用。 创建一个名为“ SimpleSearcher”的类,并确保包含一个主要方法。 此类的源代码如下:

package com.javacodegeeks.lucene;import java.io.File;import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;public class SimpleSearcher {public static void main(String[] args) throws Exception {File indexDir = new File("c:/index/");String query = "lucene";int hits = 100;SimpleSearcher searcher = new SimpleSearcher();searcher.searchIndex(indexDir, query, hits);}private void searchIndex(File indexDir, String queryStr, int maxHits) throws Exception {Directory directory = FSDirectory.open(indexDir);IndexSearcher searcher = new IndexSearcher(directory);QueryParser parser = new QueryParser(Version.LUCENE_30, "contents", new SimpleAnalyzer());Query query = parser.parse(queryStr);TopDocs topDocs = searcher.search(query, maxHits);ScoreDoc[] hits = topDocs.scoreDocs;for (int i = 0; i < hits.length; i++) {int docId = hits[i].doc;Document d = searcher.doc(docId);System.out.println(d.get("filename"));}System.out.println("Found " + hits.length);}}

我们提供索引目录,搜索查询字符串和最大匹配数,然后调用“ searchIndex”方法。 在该方法中,我们创建一个IndexSearcher,一个QueryParser和一个Query对象。 请注意,QueryParser使用我们用于使用IndexWriter创建文档的字段的名称(“内容”),并且再次使用相同类型的分析器(SimpleAnalyzer)。 我们执行搜索,并为找到匹配项的每个Document提取包含文件名(“ filename”)的字段的值,然后进行打印。 就是这样,让我们​​执行实际的搜索。 作为Java应用程序运行它,您将看到包含您提供的查询字符串的文件的名称。

可以从此处下载本教程的Eclipse项目,包括依赖库。

更新:您还可以使用Apache Lucene Spell-Checker查看我们后续的文章“您的意思是”功能 。

请享用!

相关文章 :
  • Apache Lucene拼写检查器的“您是不是要”功能
  • 使用Spring AspectJ和Maven进行面向方面的编程
  • 调度Java应用程序中的主体
  • 依赖注入–手动方式

翻译自: https://www.javacodegeeks.com/2010/05/introduction-to-apache-lucene-for-full.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的低GC:使用原语而不是包装器

总览 有两个很好的理由在可能的地方使用原语而不是包装器。 明晰。 通过使用原语&#xff0c;您可以清楚地知道null值是不合适的。 性能。 使用原语通常更快。 清晰度通常比性能更重要&#xff0c;并且是使用它们的最佳理由。 但是&#xff0c;本文讨论了使用包装程序对性能…

Java Secret:使用枚举构建状态机

总览 Java中的枚举比许多其他语言更强大&#xff0c;这可能导致令人惊讶的用途。 在本文中&#xff0c;我概述了Java 枚举的一些单独功能&#xff0c;并将它们组合在一起形成一个状态机。 单例和实用程序类的枚举 您可以非常简单地将枚举用作Singleton或Utility。 enum Si…

指向函数的指针

指向函数的指针变量的一般形式为&#xff1a;数据类型 &#xff08;*指针变量名&#xff09;&#xff08;函数参数表列&#xff09;&#xff1b;如&#xff1a; int (*p)(int ,int );1、int (*p)(int ,int );表示定义一个指向函数的指针变量p&#xff0c;它不是固定只能指向…

Tomcat中的零停机部署(和回滚); 演练和清单

亲爱的大家&#xff0c; 如果您认为Tomcat不能再进步&#xff0c;那您就错了。 Tomcat 7引入了所谓的并行部署 。 这是由SpringSource / VMWare贡献的。 简而言之&#xff0c;并行部署是一种能够并行部署一个以上版本的Web应用程序的功能&#xff0c;使所有版本都可以在完全相…

HDU 1863 畅通工程(最小生成树,prim)

题意&#xff1a; 给出图的边和点数&#xff0c;要求最小生成树的代价&#xff0c;注&#xff1a;有些点之间是不可达的&#xff0c;也就是可能有多个连通图。比如4个点&#xff0c;2条边:1-2&#xff0c;3-4。 思路&#xff1a; 如果不能连通所有的点&#xff0c;就输出‘?’…

JavaFX 2.0 beta示例应用程序和思考

我有一段时间回过头来玩JavaFX&#xff0c;并且在使用该语言方面有好有坏的经验。 随着JavaFX 2.0 beta的发布&#xff0c;我想尝试一下。 在这里&#xff0c;我开发了一个简单的地址解析应用程序&#xff0c;该应用程序将使用Google地址编码API来获取地址并提供该位置的纬度-经…

解析DBR操作系统引导记录数据

理解文件系统。你必须要熟悉DBR&#xff0c;下面我们就来看看文件系统解析DBR数据。 Dos Boot Record(DBR)操作系统引导记录是由操作系统的格式化程序建立的。在文件系统驱动操作不论什么一个磁盘卷时&#xff0c;这一部分的信息将被读取并作为文件系统在这个磁盘卷上的參数被使…

YouTube Java API入门

在本教程中&#xff0c;我将介绍Google的YouTube API &#xff0c;该API可让您使用YouTube的功能来启用应用程序。 YouTube是“杀手级”互联网应用程序之一&#xff0c;其流量占互联网总流量的很大一部分。 在开始之前&#xff0c;请确保您已阅读《 API概述指南》 。 我们将主…

ServletContext图解

servlet之间共享数据资源&#xff01; 转载于:https://www.cnblogs.com/felixzh/p/4615902.html

Linux自动化安装cobbler

1介绍 1.1 PXE PXE技术与RPL技术不同之处为RPL是静态路由&#xff0c;PXE是动态路由。RPL是根据网卡上的ID号加上其他记录组成的一个Frame&#xff08;帧&#xff09;向服务器发出请求。而服务器中已有这个ID数据&#xff0c;匹配成功则进行远程启动。PXE则是根据服务器端收到的…

Xuggler教程:帧捕获和视频创建

注意&#xff1a;这是我们的“ Xuggler开发教程 ”系列的一部分。 到目前为止&#xff0c;在我们的Xuggler教程系列中&#xff0c;我们已经对视频处理的Xuggler进行了介绍&#xff0c;并讨论了转码和媒体修改 。 在本教程中&#xff0c;我们将看到如何解码视频和捕获帧&#xf…

SignalR + MVC5 简单示例

SignalR MVC5 简单示例 原文:SignalR MVC5 简单示例本文和前一篇文章很类似&#xff0c;只不过是把 SignalR 应用在了 MVC 中 新建项目&#xff0c;选择 MVC 模板 安装 SignalR Install-Package Microsoft.AspNet.SignalR 在项目中添加文件夹 Hubs 在 Hubs 文件夹中添加 Sign…

Hive 接口介绍(Web UI/JDBC)

Hive 接口介绍&#xff08;Web UI/JDBC&#xff09; 实验简介 本次实验学习 Hive 的两种接口&#xff1a;Web UI 以及 JDBC。 一、实验环境说明 1. 环境登录 无需密码自动登录&#xff0c;系统用户名shiyanlou&#xff0c;密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubu…

Java最佳实践– Char到Byte和Byte到Char的转换

在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将讨论String性能调优。 特别是&#xff0c;我们将重点介绍使用默认编码时如何有效地处理字符到字节和字节到字符的转换。 本文总结了两种提议的自定义方法与两种经典方法&#xff0…

Java最佳实践–队列之战和链接的ConcurrentHashMap

在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将在四个具有相关语义的流行Queue实现类之间进行性能比较。 为了使事情变得更现实&#xff0c;我们将在多线程环境下进行测试&#xff0c;以讨论和演示如何将ArrayBlockingQueue &am…

关于使用racthet的push.js

racthet的push是用来跳转另外一个页面的效果的。但是必须在服务器的环境下支持。如果想要让本地html访问支持的话需要添加 转载于:https://www.cnblogs.com/djawh/p/4623925.html

“应用程序无法正常启动(oxc000007b)”解决方案

解决方案1 通过“DirectX修复工具 V3.3 标准版”软件修复。 备注&#xff1a;经过测试&#xff0c;并未解决本人的问题&#xff0c;但是这个方法可能对游戏中缺失相关.dll&#xff08;动态链接库&#xff09;有帮助。 解决方案2&#xff1a; 该问题的出现不适偶然&#xff0c;主…

7-15 计算圆周率 (15 分)

根据下面关系式&#xff0c;求圆周率的值&#xff0c;直到最后一项的值小于给定阈值。 输入格式&#xff1a; 输入在一行中给出小于1的阈值。 输出格式&#xff1a; 在一行中输出满足阈值条件的近似圆周率&#xff0c;输出到小数点后6位。 输入样例&#xff1a; 0.01结尾无…

JUnit学习之hamcrest、testSuite介绍及测试原则

[转自] http://huihai.iteye.com/blog/1994270 上一节说了junit的一些基本概念&#xff0c;主要使用assert做一些基本的判断。但很多时候使用assert做判断&#xff0c;并不方便&#xff0c;如果要判断某几个值是否为true或false&#xff0c;这时使用hamcrest来判断就会方便许多…

Java最佳实践– Vector vs ArrayList vs HashSet

在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将在三个最常用的Collection实现类之间进行性能比较。 为了使事情变得更现实&#xff0c;我们将在多线程环境下进行测试&#xff0c;以讨论和演示如何将Vector &#xff0c; ArrayLi…