热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Luence5分钟快速入门示例

使用Lucene,可以非常方便给我们的应用增加上全文索引的功能,使用上也非常简单,只需要5分钟我们就可以学会如何使用它。1、先从官方下载

使用Lucene,可以非常方便给我们的应用增加上全文索引的功能,使用上也非常简单,只需要5分钟我们就可以学会如何使用它。

1、先从官方下载,现在的最新版本是4.4.0,下面的示例代码也是基于4.4的;

2、建立一个JAVA工程,将这些个jar从Lucene的目录中找出来:lucene-analyzers-common-4.4.0.jar、lucene-core-4.4.0.jar、lucene-queries-4.4.0.jar、lucene-queryparser-4.4.0.jar,并加入到工程的classpath中;

3、示例JAVA代码,为了简单好理解,示例是以将内存中加入一些字符串,并通过查询结果,再将结果显示出来。

1)、建立内容索引


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. //创建一个分析器,这里使用的是标准分析器,适用于大多数场景,并且在StandardAnalyzer中包括了部分中文分析处理功能,虽然其本身也有一个中文分析器ChineseAnalyzer,   
  2. //不过ChineseAnalyzer将会在5.0的版本中被去掉,使用StandardAnalyzer即可。   
  3. //另外在analyzers-common中,包括了针对很多种不同语言的分析器,其中包括中文分析器   
  4. Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);  
  5.   
  6. //Directory是用于索引文件的存储的抽象类,其子类有将索引文件写到文件的,也有直接放到内存中的,这里的RAMDirectory就是放在内存中索引   
  7. //优点是速度快,缺少是不适合于大量数据的索引。这里的数据比较少,所以使用RAMDirctory非常适合。   
  8. //具体的可以查看Directory, RAMDirectory,FSDirectory等API说明,这里要强调一下的是FSDirectory是一个文件索引存储的抽象类,下面还有三个子类:MMapDirectory, NIOFSDirectory, SimpleFSDirectory,根据不同的操作系统及使用场景进行不同的选择了。   
  9. Directory index = new RAMDirectory();  
  10.   
  11. //IndexWriterConfig包括了所有创建IndexWriter的配置,一旦IndexWriter创建完成后,此时再去修改IndexWriterConfig是不会影响到IndexWriter实例的,此时如果想获取正确的IndexWirter的配置,最好是通过IndexWirter.getConfig()方法了,另外IndexWriterConfig本身也是一个final类。   
  12. IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44, analyzer);  
  13.   
  14. //顾名思义,IndexWriter是用于维护及增加索引的   
  15. IndexWriter w = new IndexWriter(index, config);  
  16.   
  17. addDoc(w, "Lucene in Action""193398817");  
  18. addDoc(w, "Lucene for Dummies""55320055Z");  
  19. addDoc(w, "Managing Gigabytes""55063554A");  
  20. addDoc(w, "The Art of Computer Science""9900333X");  
  21. w.close();  

//创建一个分析器,这里使用的是标准分析器,适用于大多数场景,并且在StandardAnalyzer中包括了部分中文分析处理功能,虽然其本身也有一个中文分析器ChineseAnalyzer,
//不过ChineseAnalyzer将会在5.0的版本中被去掉,使用StandardAnalyzer即可。
//另外在analyzers-common中,包括了针对很多种不同语言的分析器,其中包括中文分析器
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);//Directory是用于索引文件的存储的抽象类,其子类有将索引文件写到文件的,也有直接放到内存中的,这里的RAMDirectory就是放在内存中索引
//优点是速度快,缺少是不适合于大量数据的索引。这里的数据比较少,所以使用RAMDirctory非常适合。
//具体的可以查看Directory, RAMDirectory,FSDirectory等API说明,这里要强调一下的是FSDirectory是一个文件索引存储的抽象类,下面还有三个子类:MMapDirectory, NIOFSDirectory, SimpleFSDirectory,根据不同的操作系统及使用场景进行不同的选择了。
Directory index = new RAMDirectory();//IndexWriterConfig包括了所有创建IndexWriter的配置,一旦IndexWriter创建完成后,此时再去修改IndexWriterConfig是不会影响到IndexWriter实例的,此时如果想获取正确的IndexWirter的配置,最好是通过IndexWirter.getConfig()方法了,另外IndexWriterConfig本身也是一个final类。
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44, analyzer);//顾名思义,IndexWriter是用于维护及增加索引的
IndexWriter w = new IndexWriter(index, config);addDoc(w, "Lucene in Action", "193398817");
addDoc(w, "Lucene for Dummies", "55320055Z");
addDoc(w, "Managing Gigabytes", "55063554A");
addDoc(w, "The Art of Computer Science", "9900333X");
w.close();
以下是addDoc方法的代码,功能是将内容加入到索引中

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. private static void addDoc(IndexWriter w, String title, String isbn) throws IOException {  
  2.   Document doc = new Document();  
  3.   doc.add(new TextField("title", title, Field.Store.YES));  
  4.   doc.add(new StringField("isbn", isbn, Field.Store.YES));  
  5.   w.addDocument(doc);  
  6. }  

private static void addDoc(IndexWriter w, String title, String isbn) throws IOException {Document doc = new Document();doc.add(new TextField("title", title, Field.Store.YES));doc.add(new StringField("isbn", isbn, Field.Store.YES));w.addDocument(doc);
}

这里我们需要注意一下,增加标题索引使用的是TextField,增加isbn索引使用的是StringField,这两个都是IndexableField的子类,TextField表示是会被拆分并且被索引的字段,而StringField只会一个整体被索引,而不会进行拆分索引。

2)、查询通过读取命令行参数,并将其传给luence的QueryParset,再通过Query执行查询


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. String querystr = args.length > 0 ? args[0] : "lucene";  
  2. //通过查询解析器QueryParser创建一个查询Query.   
  3. //QueryParser是JavaCC(http://javacc.java.net)编译的其中最重要的方法就是QueryParserBase.parse(String),   
  4. //特别需要注意的是QueryParser不是线程安全的   
  5. Query q = new QueryParser(Version.LUCENE_44, "title", analyzer).parse(querystr);  

String querystr = args.length > 0 ? args[0] : "lucene";
//通过查询解析器QueryParser创建一个查询Query.
//QueryParser是JavaCC(http://javacc.java.net)编译的其中最重要的方法就是QueryParserBase.parse(String),
//特别需要注意的是QueryParser不是线程安全的
Query q = new QueryParser(Version.LUCENE_44, "title", analyzer).parse(querystr);

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1.   

3)、执行查询根据index创建IndexSearcher,然后TopScoreDocCollector就会返回查询的结果

  1. //这个表示每次最多显示的结果数   
  2. int hitsPerPage = 10;  
  3. //创建索引读取器   
  4. IndexReader reader = IndexReader.open(index);  
  5. //创建索引查询器   
  6. IndexSearcher searcher = new IndexSearcher(reader);  
  7. //以TopDocs的方式返回最多hitsPerPage的查询结果   
  8. TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);  
  9. //执行查询   
  10. searcher.search(q, collector);  
  11. ScoreDoc[] hits = collector.topDocs().scoreDocs;  
//这个表示每次最多显示的结果数
int hitsPerPage = 10;
//创建索引读取器
IndexReader reader = IndexReader.open(index);
//创建索引查询器
IndexSearcher searcher = new IndexSearcher(reader);
//以TopDocs的方式返回最多hitsPerPage的查询结果
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
//执行查询
searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1.   

4)、显示索引查询结果

  1. System.out.println("Found " + hits.length + " hits.");  
  2. for(int i=0;i
  3.     int docId = hits[i].doc;  
  4.     Document d = searcher.doc(docId);  
  5.     System.out.println((i + 1) + ". " + d.get("isbn") + "\t" + d.get("title"));  
  6. }  
System.out.println("Found " + hits.length + " hits.");
for(int i=0;i}
以下是完全整的代码:
[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  2. import org.apache.lucene.document.Document;  
  3. import org.apache.lucene.document.Field;  
  4. import org.apache.lucene.document.StringField;  
  5. import org.apache.lucene.document.TextField;  
  6. import org.apache.lucene.index.DirectoryReader;  
  7. import org.apache.lucene.index.IndexReader;  
  8. import org.apache.lucene.index.IndexWriter;  
  9. import org.apache.lucene.index.IndexWriterConfig;  
  10. import org.apache.lucene.queryparser.classic.ParseException;  
  11. import org.apache.lucene.queryparser.classic.QueryParser;  
  12. import org.apache.lucene.search.IndexSearcher;  
  13. import org.apache.lucene.search.Query;  
  14. import org.apache.lucene.search.ScoreDoc;  
  15. import org.apache.lucene.search.TopScoreDocCollector;  
  16. import org.apache.lucene.store.Directory;  
  17. import org.apache.lucene.store.RAMDirectory;  
  18. import org.apache.lucene.util.Version;  
  19.   
  20. import java.io.IOException;  
  21.   
  22. public class HelloLucene {  
  23.   public static void main(String[] args) throws IOException, ParseException {  
  24.     // 0. Specify the analyzer for tokenizing text.   
  25.     //    The same analyzer should be used for indexing and searching   
  26.     StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);  
  27.   
  28.     // 1. create the index   
  29.     Directory index = new RAMDirectory();  
  30.   
  31.     IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44, analyzer);  
  32.   
  33.     IndexWriter w = new IndexWriter(index, config);  
  34.     addDoc(w, "Lucene in Action""193398817");  
  35.     addDoc(w, "Lucene for Dummies""55320055Z");  
  36.     addDoc(w, "Managing Gigabytes""55063554A");  
  37.     addDoc(w, "The Art of Computer Science""9900333X");  
  38.     w.close();  
  39.   
  40.     // 2. query   
  41.     String querystr = args.length > 0 ? args[0] : "lucene";  
  42.   
  43.     // the "title" arg specifies the default field to use   
  44.     // when no field is explicitly specified in the query.   
  45.     Query q = new QueryParser(Version.LUCENE_44, "title", analyzer).parse(querystr);  
  46.   
  47.     // 3. search   
  48.     int hitsPerPage = 10;  
  49.     IndexReader reader = DirectoryReader.open(index);  
  50.     IndexSearcher searcher = new IndexSearcher(reader);  
  51.     TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);  
  52.     searcher.search(q, collector);  
  53.     ScoreDoc[] hits = collector.topDocs().scoreDocs;  
  54.       
  55.     // 4. display results   
  56.     System.out.println("Found " + hits.length + " hits.");  
  57.     for(int i=0;i
  58.       int docId = hits[i].doc;  
  59.       Document d = searcher.doc(docId);  
  60.       System.out.println((i + 1) + ". " + d.get("isbn") + "\t" + d.get("title"));  
  61.     }  
  62.   
  63.     // reader can only be closed when there   
  64.     // is no need to access the documents any more.   
  65.     reader.close();  
  66.   }  
  67.   
  68.   private static void addDoc(IndexWriter w, String title, String isbn) throws IOException {  
  69.     Document doc = new Document();  
  70.     doc.add(new TextField("title", title, Field.Store.YES));  
  71.   
  72.     // use a string field for isbn because we don't want it tokenized   
  73.     doc.add(new StringField("isbn", isbn, Field.Store.YES));  
  74.     w.addDocument(doc);  
  75.   }  
  76. }  




推荐阅读
  • 深入解析Android Activity生命周期
    本文详细探讨了Android中Activity的生命周期,通过实例代码和详细的步骤说明,帮助开发者更好地理解和掌握Activity各个阶段的行为。 ... [详细]
  • 作为一名CSS初学者,我在博客园中尝试通过CSS美化页面,特别是为超链接添加图标,以提升阅读体验。本文将分享如何使用CSS和字体图标库来实现这一功能。 ... [详细]
  • 字符、字符串和文本的处理之Char类型
    .NetFramework中处理字符和字符串的主要有以下这么几个类:(1)、System.Char类一基础字符串处理类(2)、System.String类一处理不可变的字符串(一经 ... [详细]
  • C基本语法C程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。对象-对象具有状态和行为 ... [详细]
  • 转自:http:blog.sina.com.cnsblog_67419c420100vmkt.html 1.为什么要使用blocks将一个blocks作为函数或者方法的参数传递,可 ... [详细]
  • 本文详细介绍了Golang中string类型的内部结构及其特性,包括字符串的定义、表示方式、数据结构以及相关的操作方法,如字符串拼接和类型转换等。 ... [详细]
  • 设计模式系列-原型模式
    一、上篇回顾上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每个组成部分的详细创建步骤可以是动态的变化的,但 ... [详细]
  • 深入解析 Zend Guard 4 功能与配置
    本文旨在通过图文并茂的方式详细介绍 Zend Guard 4 的核心功能及其配置方法,特别适合英文阅读能力有限的技术人员。文中不仅提供了详细的步骤说明,还附带了实际操作中的注意事项,帮助读者更好地理解和应用这一工具。 ... [详细]
  • Activity跳转动画 无缝衔接
    Activity跳转动画 无缝衔接 ... [详细]
  • MVC框架下使用DataGrid实现时间筛选与枚举填充
    本文介绍如何在ASP.NET MVC项目中利用DataGrid组件增强搜索功能,具体包括使用jQuery UI的DatePicker插件添加时间筛选条件,并通过枚举数据填充下拉列表。 ... [详细]
  • 万事起于配置开发环境
    万事起于配置开发环境 ... [详细]
  • Cadence SPB 16.5 安装指南与注意事项
    本文提供了详细的 Cadence SPB 16.5 安装步骤,包括环境配置、安装过程中的关键步骤以及常见问题的解决方案。适合初次安装或遇到问题的技术人员参考。 ... [详细]
  • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
  • 本文探讨了Web API 2中特性的路由机制,特别是如何利用它来构建RESTful风格的URI。文章不仅介绍了基本的特性路由使用方法,还详细说明了如何通过特性路由进行API版本控制、HTTP方法的指定、路由前缀的应用以及路由约束的设置。 ... [详细]
  • 本文旨在介绍一系列提升工作效率的浏览器插件和实用小工具,帮助用户在日常工作中更加便捷高效。内容由原作者授权发布。 ... [详细]
author-avatar
rfzrfz_353
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有