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,一经查实,立即删除!

相关文章

php 运算验证码类,php 数学运算验证码实现代码

//-------------------------------------// 文件说明&#xff1a;数学运算验证码// 文件作者&#xff1a;Jesse Lee// 最后更新&#xff1a;2008-09-07//-------------------------------------session_start();$sessionvar vdcode; //Session变量名称$width 150; //图像宽度…

经典ICP算法的问题

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

php 405跳转,php – 返回HTTP 405的CORS预检请求

我正在尝试创建一个RESTful Web服务,并且已经停止实现PUT请求.我尝试过但未能在本网站上关注其他答案以及Mozilla的各种文章.该请求是从域wwwtest.dev-box生成的,它将转到test.dev-box(基本上是一个调用后端应用程序的前端应用程序).以下是我从Live HTTP标头中捕获的标头&#…

wowza rtsp_使用wowza和xuggler将RTMP转为RTSP

wowza rtsp注意&#xff1a;这是我们的“ Xuggler开发教程 ”系列的一部分。 大家好&#xff01; 在过去的三个月中&#xff0c;我们一直在进行电话会议项目。 我们认为&#xff0c;使用诸如Flex之类的技术的基于Web的应用程序将是此类要求苛刻的项目的最佳方法。 随着软件的复…

iOS执行时工具-cycript

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

开启php soap,php soap 开发文档

一&#xff0e; 必备知识1.wsdl(web服务标记语言)WSDL(网络服务描述语言&#xff0c;Web Services Description Language)是一门基于 XML 的语言&#xff0c;用于描述 Web Services 以及如何对它们进行访问。具体参考请访问下面网址2.soapSOAP 是一种简单的基于 XML 的协议&…

知识点2

1. DUMMY是不是检查所有的类型的权限呢&#xff1f;PS:不是&#xff0c;dummy的意思是虚拟的意思&#xff0c;就是说权限检查的时候有这个权限检查字段&#xff0c;但是不对该字段做权限检查。AUTHORITY-CHECK OBJECT Z_BRANDID ACTVT DUMMY ID BRAND FIELD p_br…

java调用jndi出错,无法使用Java JNDI上下文查找来访问对象

我正在运行Tomcat6并希望从我的Servlet访问数据源。但我得到了javax.naming.OperationNotSupportedException: cant generate an absolute name for this namespaceat org.apache.naming.NamingContext.getNameInNamespace(NamingContext.java:772)我的context.xml在HomeContro…

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

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

MFC 错误异常,用vs添加资源并为资源定义类后报错:error C2065 : 未声明的标识符...

添加了一个Dialog资源&#xff0c;修改了ID之后右击资源添加了一个类&#xff0c;在类里面有一个成员变量&#xff1a; // 对话框数据 enum { IDD IDD_GETIN }; 而在编译过程中出现报错&#xff0c;错误代号是error C2065 : 未声明的标识符&#xff0c;我的第一反应是为什么…

php 正则匹配数字范围,正则表达式之匹配数字范围

最近有个需求就是根据产品编号批量下架产品&#xff0c;需要下架日期为16-31号之间的产品&#xff0c;比如编号为B201607280023匹配表达式如下:^201607(1[6-9]|2[0-9]|3[0-1]).逻辑很简单&#xff0c;如果是必须是1或2或3开头&#xff0c;如果是1开头则后面范围为6-9&#xff0…

php 取utc时间,得到UTC时间在PHP

使用gmdate将始终返回GMTdate。 语法与date相同。一个简单的gmdate()就足够了$time time(); $check $timedate("Z",$time); echo strftime("%B %d, %Y %H:%M:%S UTC", $check);正如以前在这里回答的那样 &#xff0c;从PHP 5.2.0开始&#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;从而使所有版本都…

dataframe建一个空的,创建一个空的Pandas DataFrame,然后填充它?

我想用时间序列计算中的值迭代地填充数据框 . 所以基本上&#xff0c;我想初始化数据框&#xff0c;包括列A&#xff0c;B和时间戳行&#xff0c;全部为0或全部为NaN .然后我会添加初始值并检查此数据&#xff0c;计算前一行中的新行&#xff0c;比如行[A] [t] 行[A] [t-1] 1左…

Android给TextView和EditText等控件设置透明背景、圆角边框

第一种方法&#xff1a;在drawable文件夹下新建一个文件设置背景样式 代码&#xff1a; 在drawable文件夹下面新建text_view_border.xml <?xml version"1.0" encoding"UTF-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/…

将jOOQ与JDBC比较

本文是我们学院课程的一部分&#xff0c;标题为jOOQ –类型安全的数据库查询 。 在SQL和特定关系数据库很重要的Java应用程序中&#xff0c;jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多&#xff0c;JDBC过多时&#xff0c;这是一种替代方法。 它显示了一种现代的领域特…

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

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

迭代器生成器可迭代对象_使用迭代器时如何避免ConcurrentModificationException

迭代器生成器可迭代对象Java Collection类是快速失败的&#xff0c;这意味着如果在使用迭代器遍历某个线程的同时更改了Collection&#xff0c;则iterator.next&#xff08;&#xff09;将抛出ConcurrentModificationException 。 在多线程以及单线程环境中都可能出现这种情况。…

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控制台的知识。熟练地使用…