apache lucene_全文搜索Apache Lucene简介

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的说法, 版本也用作构造函数参数,并且是一个“被某些类用来在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

apache lucene

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

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

相关文章

经典ICP算法的问题

最近可能要用三维点云实现一个三维场景重建的功能&#xff0c;从经典的ICP算法开始&#xff0c;啃了一些文档&#xff0c;对其原理也是一知半解。 迭代最近点算法综述 大致参考了这份文档之后&#xff0c;照流程用MATLAB实现了一个简单的ICP算法&#xff0c;首先是发现这份文档…

iOS执行时工具-cycript

cycript是大神saurik开发的一个很强大的工具&#xff0c;能够让开发人员在命令行下和应用交互&#xff0c;在执行时查看和改动应用。它确实能够帮助你破解一些应用&#xff0c;但我认为这个工具主要还是用来学习其它应用的设计&#xff08;主要是UI的设计及实现&#xff09;。 …

java是如何实现原语的_Java中的低GC:使用原语而不是包装器

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

BrnShop开源网上商城第二讲:ASP.NET MVC框架

BrnShop开源网上商城第二讲&#xff1a;ASP.NET MVC框架 原文:BrnShop开源网上商城第二讲&#xff1a;ASP.NET MVC框架在团队设计BrnShop的web项目之初&#xff0c;我们碰到了两个问题&#xff0c;第一个是数据的复用和传递&#xff0c;第二个是大mvc框架和小mvc框架的选择。下…

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

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

matlab三维选取二维,基于Matlab绘制二维和三维图形以及其他图形控制函数的使用方法...

Matlab绘图强大的绘图功能是Matlab的特点之一&#xff0c;Matlab提供了一系列的绘图函数&#xff0c;用户不需要过多的考虑绘图的细节&#xff0c;只需要给出一些基本参数就能得到所需图形&#xff0c;这类函数称为高层绘图函数。此外&#xff0c;Matlab还提供了直接对图形句柄…

Console命令详解,让调试js代码变得更简单

刚刚在浏览关于js方面的博客时发现这个方法挺好玩的&#xff0c;自己爽了一把。 1 <script> 2 console.time(/X(.)X/ test); 3 "XX".match(/X(.)X/); 4 console.timeEnd(/X(.)X/ test); 5 </script> 然后恶补了一下关于Firebug控制台的知识。熟练地使用…

PHP求体重成绩函数,PHP数组

数组提出一个问题&#xff1a;一个养鸡场有6只鸡&#xff0c;他们的体重分别为3kg&#xff0c;5kg&#xff0c;1k个&#xff0c;3.4kg&#xff0c;2kg&#xff0c;6.kg请问这六只鸡的总体重是多少平均体重是多少请你用现在掌握的技术编一个程序现在我们使用现有的技术来解决问题…

k8s secret使用_Java Secret:使用枚举构建状态机

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

mydumper备份原理和使用方法

mydumper介绍 MySQL自身的mysqldump工具支持单线程工作&#xff0c;依次一个个导出多个表&#xff0c;没有一个并行的机&#xff0c;这就使得它无法迅速的备份数据。 mydumper作为一个实用工具&#xff0c;能够良好支持多线程工作&#xff0c;可以并行的多线程的从表中读入数据…

matlab pca可视化,利用Matlab实现PCA demo展示

input_data rand(1000,3);%随机生成1000个样本&#xff0c;每个样本有x,y,z三个属性 figure(1);%控制画图的窗口为1hold off;%使当前轴和图形不再具备被刷新的性质&#xff0c;关闭在此基础上再画图plot3(input_data(:,1), input_data(:,2), input_data(:,3), ‘ro‘);%% Func…

matlab短均线滞后项,均线理论的滞后性问题

对移动平均线有一定了解的人都会发现移动平均线理论存在一个缺点&#xff0c;那就是移动平均线的信号具有一定的滞后性&#xff0c;这是制约移动平均线运用的最大因素。介绍了均线的计算方法.从它的计算方法中也能看出目前均线的数值要受到前一阶段股价的影响&#xff0c;而且均…

python捕获摄像头帧_Xuggler教程:帧捕获和视频创建

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

MyEclipse 编写 ExtJS 卡死问题解决方法

MyEclipse 8.6 在 jsp 中编写 ExtJS时&#xff0c;会出现卡死现象&#xff0c;让人甚是头疼。网上找了很多方法&#xff0c;折腾半天&#xff0c;还是不管用。 什么MyEclipse 优化&#xff0c;Validation 取消&#xff0c;MyEclipse 在 JSP 中打 "点" 时&#xff0…

java的aqs是什么,AQS在Java中的应用

上篇文章我们详细分析了AQS的底层实现原理,这节就来探索jdk中使用AQS实现的工具类ReentrantLock一, 是什么?怎么用?是什么?是一个独占锁,也就是在并发环境下同一时刻只能有一个线程获得资源,也是一个可重入锁.可重入锁: 一个线程已经获取到了该资源,下次再次获取资源时不会出…

php怎么把字符转成大写,php怎么把字符串转换为大写

php把字符串转换为大写的方法&#xff1a;可以利用内置函数strtoupper()来进行转换。strtoupper()函数可以把指定的字符串转换为大写&#xff0c;并返回被转换为大写的字符串。使用函数&#xff1a;(学习视频推荐&#xff1a;php视频教程)strtoupper() 函数把字符串转换为大写&…

oracle存储过程与函数的区别及作用,Oracle存储过程与存储函数-入门

文章思维导图一. 存储过程和存储函数的定义定义&#xff1a;存储在数据库中&#xff0c;供所有用户程序调用的子程序叫做存储过程/存储函数。复杂点的解释&#xff1a;存储过程(Stored Procedure)&#xff0c;就是一组用于完成特定数据库功能的SQL 语句集&#xff0c;该SQL语句…

CC++初学者编程教程(8) VS2013配置编程助手与QT

1. 2. 配置编程助手 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19&#xff0e; 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30&#xff0e; 31. 32&#xff0e; 33. 34. 35. 36. 37. 38. 39 40 41 42 43 这个时候我们就在VS2013里面集成了QT&#xff0c;编程助…

转子碰磨 matlab,航空科普:什么是航空发动机转子碰磨?

中国航空报讯&#xff1a;随着人们对航空发动机油耗、推重比等要求的逐步提高&#xff0c;提升航空发动机运行效率&#xff0c;尤其是提升民用航空发动机的经济性已经变得越来越重要。航空发动机的总体运行效率是气动效率、燃烧效率、冷却效率与机械效率等共同决定的。其中&…

Android 自定义 ListView 显示网络上 JSON 格式歌曲列表

本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章&#xff0c;没有源代码可下载&#xff0c;根据文中提供的代码片段&#xff0c;自己新建的项目&#xff08;比较可恶的是&#xff0c;没有图标图片资源&…