热门标签 | 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. }  




推荐阅读
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
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社区 版权所有