0%
这是一片思考的空间 -- arthinking
Spring 重构&代码整洁之道 软件设计 JVM 并发编程 数据结构与算法 分布式 存储 网络 微服务 设计模式
Java技术栈 - 涉及Java技术体系

Lucene基本示例和关键类介绍

1、Lucene简介

Lucene是一个用Java写的全文索引引擎工具包,可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。

传统的数据库中的模糊查询 like %keyword% 是从数据库逐行匹配的,就像翻书一页页的查找需要的内容,所以效率也就自然很低了。而Lucene的全文索引指的是建立一个类似于科技索引一样的反向索引机制,将数据源排序存储,并提取出关键词并把关键词排好序,然后把关键词和文章映射好。所以检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组合过程。全文检索问题归结到最后就是一个排序问题。

可以从官网下载最新的Lucene:

http://lucene.apache.org/core/

2、简单的示例

以下是官网给的一个简单的例子:

public class demo1 {

public static void main(String[] args){
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);

    // Store the index in memory:
    Directory directory = new RAMDirectory();
    // To store an index on disk, use this instead:
    //Directory directory = FSDirectory.open("/tmp/testindex");
    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);
    IndexWriter iwriter;
    try {
        iwriter = new IndexWriter(directory, config);
        Document doc = new Document();
        String text = "This is the text to be indexed.";
        doc.add(new Field("fieldname", text, TextField.TYPE_STORED));
        iwriter.addDocument(doc);
        iwriter.close();

        // Now search the index:
        DirectoryReader ireader = DirectoryReader.open(directory);
        IndexSearcher isearcher = new IndexSearcher(ireader);
        // Parse a simple query that searches for "text":
        QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "fieldname", analyzer);
        Query query = parser.parse("text");
        ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;
        System.out.println("hits num: " \+ hits.length);
        // Iterate through the results:
        for (int i = 0; i < hits.length; i++) {
          Document hitDoc = isearcher.doc(hits[i].doc);
          System.out.println("filename: " \+ hitDoc.get("fieldname"));
        }
        ireader.close();
        directory.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

需要的Jar:

You need four JARs: the Lucene JAR(lucene-core-{version}.jar), the queryparser JAR(lucene-queryparser-{version}.jar), the common analysis JAR(lucene-analyzers-common-{version}.jar), and the Lucene demo JAR(lucene-demo-{version}.jar).

3、几个关键词的解释:

分析器(analyzer)与分词器(tokenizer)和过滤器(tokenfilter)

analyzer主要包含分词器跟过滤器,他的功能是:将分词器跟分析器进行合理的组合,使之产生对文本分词和过滤效果。因此,分析器使用分词和过滤器构成一个管道,文本在“滤过”这个管道之后,就成为可以进入索引的最小单位。

tokenizer主要用于对文本资源进行切分,将文本规则切分为一个个可以进入索引的最小单元 3〉tokenfilter主要对分词器切分的最小单位进入索引进行预处理,如:大写转小写,复数转单数,也可以复杂(根据语义改写拼写错误的单词)

4、Lucene基本的包结构:

Lucene API被分到若干个包中:

_1、org.apache.lucene.analysis:_定义了一个抽象的(分析器)Analyzer API,用来把文本从一个Reader输入流,转换为TokenStream(分词流),这个分词流是一个分词属性的列举。分析器使用分词和过滤器构成一个管道,文本在“滤过”这个管道之后,就成为可以进入索引的最小单位。Analyzer主要包含Tokenizer(分词器)跟(TokenFilters)过滤器。 analyzers-common包含了一系列分析器的实现,包括StopAnalyzer 和grammar-based StandardAnalyzer。

_2、org.apache.lucene.codecs:_提供了一个反向索引结构的抽象,根据不同的应用需求,提供了不同的具体实现。

_3、org.apache.lucene.document:_提供了一个简单Document类,一个Document由一系列的Field组成,Field的值可能是字符串或者java.io.Reader的一个实例。

_4、org.apache.lucene.index:_提供了两个主要的类:IndexWriter 用来创建并添加documents到索引,以及IndexReader 用来访问索引数据。

_5、org.apache.lucene.search:_提供特定的数据结构(Query)来进行查询(如TermQuery用来进行词条查询,PhraseQuery用来进行多关键词搜索,BooleanQuery用来进行“与或”搜索)并提供了IndexSearcher用来把查询转换为TopDocs。提供了一系列的QueryParser用来解析查询结构。

_6、org.apache.lucene.store:_定义了一个抽象类Directory来存储持久化数据,一个用来由IndexOutput执行写操作和由IndexInput执行读操作的文件集合,提供了多种实现,包括使用文件系统目录来存放文件的FSDirectory和用在内存中创建目录,并在目录中添加和删除文件的RAMDirectory。

_7、org.apache.lucene.util:_包含了一些便捷的数据结构和辅助类,如OpenBitSet和PriorityQueue。

5、在应用程序中使用Lucene的方法:

1、创建一个Document对象,并添加Field

2、创建一个IndexWrite,并通过其addDocument()方法把上一步创建的Document对象添加到里面

3、调用QueryParser.parse(String keywords)方法来创建一个查询对象Query

4、创建一个IndexSearcher,并把上一步的Query对象传入IndexSearcher的search()方法进行查询

查看官方说明:

http://lucene.apache.org/core/4_0_0/core/overview-summary.html

欢迎关注我的其它发布渠道

订阅IT宅
内功修炼
Java技术栈
Java架构杂谈是IT宅精品文章公众号,欢迎订阅:
📄 网络基础知识:两万字长文50+张趣图带你领悟网络编程的内功心法 📄 HTTP发展史:三万长文50+趣图带你领悟web编程的内功心法 📄 HTTP/1.1:可扩展,可靠性,请求应答,无状态,明文传输 📄 HTTP/1.1报文详解:Method,URI,URL,消息头,消息体,状态行 📄 HTTP常用请求头大揭秘 📄 HTTPS:网络安全攻坚战 📄 HTTP/2:网络安全传输的快车道 📄 HTTP/3:让传输效率再一次起飞 📄 高性能网络编程:图解Socket核心内幕以及五大IO模型 📄 高性能网络编程:三分钟短文快速了解信号驱动式IO 📄 高性能网络编程:彻底弄懂IO复用 - IO处理杀手锏,带您深入了解select,poll,epoll 📄 高性能网络编程:异步IO:新时代的IO处理利器 📄 高性能网络编程:网络编程范式 - 高性能服务器就这么回事 📄 高性能网络编程:性能追击 - 万字长文30+图揭秘8大主流服务器程序线程模型
📄 Java内存模型:如果有人给你撕逼Java内存模型,就把这些问题甩给他 📄 一文带你彻底理解同步和锁的本质(干货) 📄 AQS与并发包中锁的通用实现 📄 ReentrantLock介绍与使用 📄 ReentrantReadWriteLock介绍与使用 📄 ReentrantLock的Condition原理解析 📄 如何优雅的中断线程 📄 如何优雅的挂起线程 📄 图解几个好玩的并发辅助工具类 📄 图解BlockingQueue阻塞队列
📄 消息队列那么多,为什么建议深入了解下RabbitMQ? 📄 高并发异步解耦利器:RocketMQ究竟强在哪里? 📄 Kafka必知必会18问:30+图带您看透Kafka
📄 洞悉MySQL底层架构:游走在缓冲与磁盘之间 📄 SQL运行内幕:从执行原理看调优的本质 📄 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法