`

Lucene简介与实现

阅读更多
1. Lucene简介

Lucece官网:http://lucene.apache.org/

2. Lucene实现

New maven project ->
Create a simple project ->
    Group Id: com.andrew.lucene
    Artifact Id: Lucene01
    Version: 0.0.1-SNAPSHOT
    Packaging: jar


Indexer.java代码

package com.andrew.lucene;

import java.io.File;
import java.io.FileReader;
import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class Indexer {
    private IndexWriter writer; // 写索引实例
    // 构造方法 实例化IndexWriter
    public Indexer(String indexDir) throws Exception {
        Directory dir = FSDirectory.open(Paths.get(indexDir));
        Analyzer analyzer = new StandardAnalyzer(); // 标准分词器
        IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
        writer = new IndexWriter(dir, iwc);
    }
    // 索引指定目录的所有文件
    public int index(String dataDir) throws Exception {
        File[] files = new File(dataDir).listFiles();
        for (File f : files) {
            indexFile(f);
        }
        return writer.numDocs();
    }
    // 索引指定文件
    private void indexFile(File f) throws Exception {
        System.out.println("索引文件:" + f.getCanonicalPath());
        Document doc = getDocument(f);
        writer.addDocument(doc);
    }
    // 获取文档,文档里再设置每个字段
    private Document getDocument(File f) throws Exception {
        Document doc = new Document();
        doc.add(new TextField("contents", new FileReader(f)));
        doc.add(new TextField("fileName", f.getName(), Field.Store.YES));
        doc.add(new TextField("fullPath", f.getCanonicalPath(), Field.Store.YES));
        return doc;
    }
    // 关闭写索引
    public void close() throws Exception {
        writer.close();
    }
    public static void main(String[] args) {
        String indexDir = "E:\\lucene";
        String dataDir = "E:\\lucene\\data";
        Indexer indexer = null;
        int numIndexed = 0;
        long start = System.currentTimeMillis();
        try {
            indexer = new Indexer(indexDir);
            numIndexed = indexer.index(dataDir);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                indexer.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("索引:" + numIndexed + " 个文件,花费了" + (end - start) + "毫秒");
    }
}

执行结果

索引文件:E:\lucene\data\CHANGES.txt
索引文件:E:\lucene\data\JRE_VERSION_MIGRATION.txt
索引文件:E:\lucene\data\LICENSE.txt
索引文件:E:\lucene\data\MIGRATE.txt
索引文件:E:\lucene\data\NOTICE.txt
索引文件:E:\lucene\data\README.txt
索引文件:E:\lucene\data\SYSTEM_REQUIREMENTS.txt
索引:7 个文件,花费了901毫秒


Searcher.java代码

package com.andrew.lucene;

import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.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;

public class Searcher {
    public static void search(String indexDir, String q) throws Exception {
        Directory dir = FSDirectory.open(Paths.get(indexDir));
        IndexReader reader = DirectoryReader.open(dir);
        IndexSearcher is = new IndexSearcher(reader);
        Analyzer analyzer = new StandardAnalyzer(); // 标准分词器
        QueryParser parser = new QueryParser("contents", analyzer);
        Query query = parser.parse(q);
        long start = System.currentTimeMillis();
        TopDocs hits = is.search(query, 10);
        long end = System.currentTimeMillis();
        System.out.println("匹配 " + q + ",总共花费" + (end - start) + "毫秒" + "查询到" + hits.totalHits + "个记录");
        for (ScoreDoc scoreDoc : hits.scoreDocs) {
            Document doc = is.doc(scoreDoc.doc);
            System.out.println(doc.get("fullPath"));
        }
        reader.close();
    }
    public static void main(String[] args) {
        String indexDir = "E:\\lucene";
        String q = "Zygmunt Saloni";
        try {
            search(indexDir, q);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

执行结果

匹配 Zygmunt Saloni,总共花费24毫秒查询到1个记录
E:\lucene\data\LICENSE.txt
分享到:
评论

相关推荐

    Lucene简介.介绍

    【Lucene 简介】 Lucene 是一个强大的开源全文搜索库,由 Java 编写,主要用于为应用程序添加全文检索功能。它不是一个完整的全文搜索引擎应用,而是一个工具包,允许开发者将其集成到自己的软件中,以实现高效、...

    一种基于Lucene检索引擎的全文数据库的研究与实现

    ##### 3.1 Lucene简介 Lucene是一款高性能的全文搜索引擎库,由Java编写,能够为应用程序提供全文检索功能。Lucene不仅支持基本的全文检索,还提供了诸如高亮显示、模糊查询等功能,使得搜索结果更加贴近用户的实际...

    Lucene.Net实现全文搜索

    ### Lucene.Net 实现全文搜索 #### 一、Lucene.Net 概述 **Lucene.Net** 是一个基于 .NET 的高性能全文检索引擎库。它最初由 Java 版本的 Lucene 发展而来,旨在为 .NET 开发者提供一个强大而灵活的搜索解决方案。...

    lucene实现全文搜索

    【Lucene简介】 Lucene是一个由Java编写的高性能、可扩展的全文搜索引擎库。它提供了一种机制,使得开发者能够轻松地为自己的应用程序添加索引和搜索功能。作为Apache软件基金会的项目,Lucene具有开源和免费的特性...

    android+lucene实现全文检索并高亮关键字

    1. **Lucene简介**:Lucene是一个开源Java库,专门用于构建全文搜索引擎。它提供了索引和搜索文本的能力,支持高级的搜索语法和布尔运算。Lucene可以处理大量数据,并且具有高效的数据结构和算法,确保快速的搜索...

    利用Lucene 实现高级搜索

    #### Lucene简介 Lucene是Apache软件基金会下的一个开源全文检索库,提供了高性能的文本搜索能力。它不仅适用于网站的搜索功能,还可以用于任何需要文本搜索的应用场景,如邮件客户端、文档管理系统等。 #### 布尔...

    搜索引擎Lucene 简介.doc

    **Lucene搜索引擎简介** Lucene是一个开源的全文检索引擎库,最初由Doug Cutting教授编写,以Java语言实现,主要用于提供文本数据的快速索引和检索功能。随着时间的推移,由于市场需求,Lucene已被移植到.NET、C++...

    lucene实现过程中存在的问题

    #### 一、Lucene简介与应用场景 Lucene是一款高性能、全功能的文本搜索引擎库,它被广泛应用于各种需要进行高效全文检索的应用场景中,例如网站搜索、文档管理等。由于其高度可定制化的特点,开发者可以根据具体...

    lucene所有的jar包

    一、Lucene简介 Lucene是Apache软件基金会的一个开放源代码项目,它提供了一个高性能、全文本搜索的API。Lucene支持索引和搜索文本,可以集成到各种Java应用程序中,帮助开发者轻松实现全文检索功能。其核心特性...

    lucene简介

    ### Lucene简介及原理 #### 一、Lucene概述 Lucene是一款优秀的、成熟的、开源的、纯Java语言编写的全文检索工具包。全文检索技术指的是计算机程序通过对文档中的每一个词建立索引的方式,记录每个词在文档中的...

    Lucene与中文分词技术的研究及应用

    #### Lucene简介与原理 Lucene是一款高性能、全功能的文本搜索引擎库,由Java语言编写而成。它为开发者提供了构建全文搜索引擎的能力,而无需关注底层搜索机制的具体实现细节。Lucene的核心概念包括文档(Document...

    Lucene基于Java的全文检索引擎简介

    ### Lucene基于Java的全文检索引擎简介 #### 一、Lucene概述与历史背景 Lucene是一个基于Java的全文检索引擎工具包,旨在为各种规模的应用程序提供强大的文本搜索功能。该工具包由Doug Cutting创建,他是全文检索...

    java Lucene初级教程

    lucene简介 1.1 什么是lucene  Lucene是一个全文搜索框架,而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。 2 lucene的工作方式  lucene...

    Lucene 使用正则表达式

    1. **Lucene简介** 2. **正则表达式(regex)在Lucene中的应用** 3. **regexQuery详解** 4. **示例代码解析** 5. **索引创建与查询流程** 6. **正则表达式的语法** #### Lucene简介 Lucene是一个高性能、全功能的全文...

    Lucene:基于Java的全文检索引擎简介

    1. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 2. 全文检索的实现:Luene全文索引和数据库索引的比较 3. 中文切分词机制简介:基于词库和自动切分词算法的比较 4. 具体的安装和使用简介:系统结构...

    lucene部署配置与运行测试

    #### 一、Lucene简介 Lucene是一款开源的全文检索引擎工具包,其主要功能在于提供了一个全面的框架来构建全文检索引擎。虽然它本身并不是一个完整的搜索引擎解决方案,但包含了实现全文检索所需的各种组件:包括查询...

    Lucene3.0.3+盘古分词 资源汇总

    一、Lucene简介 Lucene的核心功能包括文档的索引、搜索以及相关性排序。它提供了一个简单的API,允许开发者对文本进行索引,并通过搜索接口快速找到相关的文档。Lucene 3.0.3是一个相对稳定的版本,尽管较新的版本...

Global site tag (gtag.js) - Google Analytics