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

Lucene初学5.3.0

由于项目需要用到Lucene,所以决定这个周末学一下Lucene,Lucene最新的版本是5.3.0。下载5.3.0后发现有点坑,文档的例子好像有点旧。下面是文档中的代码片段,但是

由于项目需要用到Lucene,所以决定这个周末学一下Lucene,Lucene最新的版本是5.3.0。下载5.3.0后发现有点坑,文档的例子好像有点旧。

下面是文档中的代码片段,但是5.3.0的FSDirectory.open()参数是Path类型的,而不是String类型的。

 1     Analyzer analyzer = new StandardAnalyzer();
 2 
 3     // Store the index in memory:
 4     Directory directory = new RAMDirectory();
 5     // To store an index on disk, use this instead:
 6     //Directory directory = FSDirectory.open("/tmp/testindex");
 7     IndexWriterConfig cOnfig= new IndexWriterConfig(analyzer);
 8     IndexWriter iwriter = new IndexWriter(directory, config);
 9     Document doc = new Document();
10     String text = "This is the text to be indexed.";
11     doc.add(new Field("fieldname", text, TextField.TYPE_STORED));
12     iwriter.addDocument(doc);
13     iwriter.close();
14     
15     // Now search the index:
16     DirectoryReader ireader = DirectoryReader.open(directory);
17     IndexSearcher isearcher = new IndexSearcher(ireader);
18     // Parse a simple query that searches for "text":
19     QueryParser parser = new QueryParser("fieldname", analyzer);
20     Query query = parser.parse("text");
21     ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;
22     assertEquals(1, hits.length);
23     // Iterate through the results:
24     for (int i = 0; i ) {
25       Document hitDoc = isearcher.doc(hits[i].doc);
26       assertEquals("This is the text to be indexed.", hitDoc.get("fieldname"));
27     }
28     ireader.close();
29     directory.close();

我个人不太喜欢接触最新版本的东西,最新的东西一般网上的资料都很少,这会给学习带来不少麻烦,但是在Apache官网找了很久没找到旧版本的,所以也只能学5.3.0。

下面是根据文档自己编写的一个小DEMO(以书为例子创建索引库)。

整个目录的结构如下:

技术分享

这里我对经常用到的代码进行了提取,创建了两个工具类:IndexUtil(提供indexWriter和indexSearcher),BookDocUtil(实现Book实体和Document对象的转化)。

1、IndexUtil.java

 1 package util;
 2 
 3 import java.nio.file.Paths;
 4 import org.apache.lucene.analysis.Analyzer;
 5 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 6 import org.apache.lucene.index.DirectoryReader;
 7 import org.apache.lucene.index.IndexWriter;
 8 import org.apache.lucene.index.IndexWriterConfig;
 9 import org.apache.lucene.search.IndexSearcher;
10 import org.apache.lucene.store.Directory;
11 import org.apache.lucene.store.FSDirectory;
12 
13 public class IndexUtil {
14 
15     private static final String INDEX_DIR = "./index";
16     private static IndexWriter iWriter;
17     private static IndexSearcher iSearcher;
18     
19     private IndexUtil(){}
20     
21     public static IndexWriter getIndexWriter() {
22         try {
23             Directory dir = FSDirectory.open(Paths.get(INDEX_DIR));
24             Analyzer analyzer = new StandardAnalyzer();
25             IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
26             iWriter = new IndexWriter(dir, iwc);
27         } catch (Exception e) {
28             throw new RuntimeException(e);
29         }
30         return iWriter;
31     }
32     
33     public static IndexSearcher getIndexSearcher() {
34         try {
35             Directory dir = FSDirectory.open(Paths.get(INDEX_DIR));
36             DirectoryReader dirReader = DirectoryReader.open(dir);
37             iSearcher = new IndexSearcher(dirReader);
38         } catch (Exception e) {
39             throw new RuntimeException(e);
40         }
41         return iSearcher;
42     }
43 }

2、BookDocUtil.java

 1 package util;
 2 
 3 import org.apache.lucene.document.Document;
 4 import org.apache.lucene.document.Field;
 5 import org.apache.lucene.document.Field.Index;
 6 import org.apache.lucene.document.Field.Store;
 7 
 8 import entity.Book;
 9 
10 public class BookDocUtil {
11 
12     private BookDocUtil(){}
13     
14     public static Document book2Doc(Book book) {
15         Document doc = new Document();
16         Field field = null;
17         field = new Field("id", book.getId().toString(), Store.YES, Index.NOT_ANALYZED);
18         doc.add(field);
19         field = new Field("isbn", book.getIsbn(), Store.YES, Index.NO);
20         doc.add(field);
21         field = new Field("name", book.getName(), Store.YES, Index.ANALYZED);
22         doc.add(field);
23         field = new Field("author", book.getAuthor(), Store.YES, Index.NO);
24         doc.add(field);
25         field = new Field("introduction", book.getIntroduction(), Store.YES, Index.ANALYZED);
26         doc.add(field);
27         return doc;
28     }
29     
30     public static Book doc2Book(Document doc) {
31         Book book = new Book();
32         book.setId(Integer.parseInt(doc.get("id")));
33         book.setIsbn(doc.get("isbn"));
34         book.setName(doc.get("name"));
35         book.setAuthor(doc.get("author"));
36         book.setIntroduction(doc.get("introduction"));
37         return book;
38     }
39 }

这里我是以书为例子,下面是书的实体类,为了便于打印,这里重写了toString()方法。

3、Book.java

 1 package entity;
 2 
 3 public class Book {
 4 
 5     private Integer id;
 6     private String isbn;
 7     private String name;
 8     private String author;
 9     private String introduction;
10 
11         //    这里省略了setter , getter
12     
13     @Override
14     public String toString() {
15         return new StringBuffer()
16                 .append("#id : " + this.id)
17                 .append("\t#isbn : " + this.isbn)
18                 .append("\t#name : " + this.name)
19                 .append("\t#author : " + this.author)
20                 .append("\tintroducation : " + this.introduction)
21                 .toString();
22     }
23 }

第一次接触Lucene,仅仅在BookLuenceService中实现了两个功能 save()、query()。

4、BookLuceneService.java

 1 package lucene;
 2 
 3 import java.io.IOException;
 4 import java.util.ArrayList;
 5 import java.util.List;
 6 
 7 import org.apache.lucene.document.Document;
 8 import org.apache.lucene.index.IndexWriter;
 9 import org.apache.lucene.index.Term;
10 import org.apache.lucene.search.IndexSearcher;
11 import org.apache.lucene.search.ScoreDoc;
12 import org.apache.lucene.search.TermQuery;
13 import org.apache.lucene.search.TopDocs;
14 
15 import entity.Book;
16 import util.BookDocUtil;
17 import util.IndexUtil;
18 
19 public class BookLuceneService {
20 
21     private boolean debug = false;
22     
23     public BookLuceneService(boolean debug) {
24         this.debug = debug;
25     }
26 
27     public void save( Book book ) {
28         IndexWriter iWriter = IndexUtil.getIndexWriter();
29         try {
30             iWriter.addDocument(BookDocUtil.book2Doc(book));
31         } catch (IOException e) {
32             throw new RuntimeException(e);
33         } finally {
34             try {
35                 iWriter.close();
36             } catch (IOException e) {
37                 throw new RuntimeException(e);
38             }
39         }
40     }
41     
42     public List query(Integer id) {
43         List bookList = new ArrayList();
44         IndexSearcher iSearcher = IndexUtil.getIndexSearcher();
45         try {
46             TopDocs topDocs = iSearcher.search(new TermQuery(new Term("id", id.toString())), 10);
47             ScoreDoc []scoreDocs = topDocs.scoreDocs;
48             
49             ScoreDoc sTemp = null;
50             Document doc = null;
51             for (int i = 0; i ) {
52                 sTemp = scoreDocs[i];
53                 //-----debug info-----------
54                 if (debug) System.err.println("doc : " + sTemp.doc + "\tscore : " + sTemp.score);
55                 //--------------------------
56                 doc = iSearcher.doc(sTemp.doc);
57                 bookList.add(BookDocUtil.doc2Book(doc));
58             }
59             
60         } catch (IOException e) {
61             throw new RuntimeException(e);
62         } 
63         return bookList;
64     }
65     
66 }

最后创建一个测试类对这两个功能进行测试( 首先运行testSave()创建索引,然后运行testQuery()进行查询 ):

5、_Test_BookLuceneService.java

 1 package test;
 2 
 3 import org.junit.AfterClass;
 4 import org.junit.BeforeClass;
 5 import org.junit.Test;
 6 
 7 import entity.Book;
 8 import lucene.BookLuceneService;
 9 
10 public class _Test_BookLuceneService {
11 
12     private static BookLuceneService bookLuceneService;
13     
14     @BeforeClass
15     public static void init() {
16         bookLuceneService = new BookLuceneService(true);
17     }
18     
19     
20 //    @Test
21     public void testSave() {
22         
23         Book book = new Book();
24         book.setId(1);
25         book.setIsbn("978-7-121-21732-6");
26         book.setName("Hello World");
27         book.setAuthor("ITC10");
28         book.setIntroduction("Say hello world to every language.");
29         
30         bookLuceneService.save(book);
31     }
32     
33     @Test
34     public void testQuery() {
35         
36         for( Book book : bookLuceneService.query(1)) {
37             System.out.println(book.toString());
38         }
39     }
40     
41     @AfterClass
42     public static void destroy () {
43         bookLuceneService = null;
44     }
45 }

测试testQuery()结果如下:

1 doc : 0    score : 0.30685282
2 #id : 1    #isbn : 978-7-121-21732-6    #name : Hello World    #author : ITC10    introducation : Say hello world to every language.

这里可以刷新项目工程目录,会发现多了一个index目录,这就是索引库的位置。

技术分享

第一次学Lucene还得继续慢慢摸索。

Lucene 初学-5.3.0


推荐阅读
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 在 Android 开发中,`android:exported` 属性用于控制组件(如 Activity、Service、BroadcastReceiver 和 ContentProvider)是否可以被其他应用组件访问或与其交互。若将此属性设为 `true`,则允许外部应用调用或与之交互;反之,若设为 `false`,则仅限于同一应用内的组件进行访问。这一属性对于确保应用的安全性和隐私保护至关重要。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 二分查找算法详解与应用分析:本文深入探讨了二分查找算法的实现细节及其在实际问题中的应用。通过定义 `binary_search` 函数,详细介绍了算法的逻辑流程,包括初始化上下界、循环条件以及中间值的计算方法。此外,还讨论了该算法的时间复杂度和空间复杂度,并提供了多个应用场景示例,帮助读者更好地理解和掌握这一高效查找技术。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 本指南详细介绍了如何在CentOS 6.6 64位系统上以root用户身份部署Tomcat 8服务器。系统环境为CentOS 6.6 64位,采用源码安装方式。所需软件为apache-tomcat-8.0.23.tar.gz,建议将软件下载至/root/opt目录。具体下载地址请参见官方资源。本指南涵盖了从环境准备到服务启动的完整步骤,适用于需要在该系统环境下搭建高性能Web应用服务器的技术人员。 ... [详细]
  • 这是一道涉及数学计算的问题。假设步行速度为 \(a\),车速为 \(b\),总距离为 \(c\)。Teddy 的步行时间为 \(T_1\),WhereIsHeroFrom 的步行时间为 \(T_2\),总时间为 \(T\)。通过分析不同时间段内的速度变化,可以得出最优的车辆使用策略,以最小化总的旅行时间。具体来说,需要计算在不同情况下步行和乘车的时间分配,以确保整体效率最大化。 ... [详细]
  • 在 POJ1651 的乘法谜题挑战中,如果选手按相反顺序选择卡片,即先选 50,再选 20,最后选 1,则最终得分会有所不同。题目要求输入的第一行包含... 改写后的摘要:在 POJ1651 的乘法谜题挑战中,如果选手按照逆序选取卡片,例如依次选择 50、20 和 1,最终的得分将发生变化。题目首先要求输入的第一行包括... ... [详细]
  • 资源管理器的基础架构包括三个核心组件:1)资源池,用于将CPU和内存等资源分配给不同的容器;2)负载组,负责承载任务并将其分配到相应的资源池;3)分类函数,用于将不同的会话映射到合适的负载组。该系统提供了两种主要的资源管理策略。 ... [详细]
  • 在Java中,当创建一个对象时,首先会为该对象的所有实例变量分配内存(前提是类已经加载),随后执行实例变量的初始化。接着,系统会按顺序执行静态初始化块、非静态初始化块以及构造器中的代码,确保对象的完整初始化。这一过程保证了对象的状态在创建时是正确且一致的。 ... [详细]
  • 该问题可能由守护进程配置不当引起,例如未识别的JVM选项或内存分配不足。建议检查并调整JVM参数,确保为对象堆预留足够的内存空间(至少1572864KB)。此外,还可以优化应用程序的内存使用,减少不必要的内存消耗。 ... [详细]
  • ### 摘要`mkdir` 命令用于在指定位置创建新的目录。其基本格式为 `mkdir [选项] 目录名称`。通过该命令,用户可以在文件系统中创建一个或多个以指定名称命名的文件夹。执行此操作的用户需要具备相应的权限。此外,`mkdir` 还支持多种选项,如 `-p` 用于递归创建多级目录,确保路径中的所有层级都存在。掌握这些基本用法和选项,有助于提高在 Linux 系统中的文件管理效率。 ... [详细]
author-avatar
我就是我
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有