`
xiang37
  • 浏览: 429525 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Lucene4全文索引示例

 
阅读更多

Lucene4.2.1示例,之前也做过3.6的示例。3.6的分词需要使用IKAnalyzer或者其他的分词,对中文的支持可能才会更好,但是4.2为我们提供了SmartChineseAnalyzer这个中文分词器。

 

下面是一个简单的示例程序,分别对应增删改查:

 

package com.xiva.test.lucene;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
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.SimpleFSDirectory;
import org.apache.lucene.util.Version;

public class IvFileIndex
{

    private static List<File> fileList = new ArrayList<File>(1024);

    public static void listAllFile(File fileDir)
    {
        File[] files = fileDir.listFiles();
        for (File file : files)
        {
            if (file.isDirectory())
            {
                listAllFile(file);
            }
            else
            {
                fileList.add(file);
            }
        }
    }

    public static void main(String[] args) throws Exception
    {
        File fileDir = new File("F:\\WorkSpace");
        File indexDir = new File("F:\\WorkSpace\\EclipseProjects\\luceneIndex");

        Analyzer luceneAnalyzer = new SmartChineseAnalyzer(Version.LUCENE_42);

        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_42, luceneAnalyzer);
        config.setOpenMode(org.apache.lucene.index.IndexWriterConfig.OpenMode.CREATE);

        Directory fsDir = new SimpleFSDirectory(indexDir);
        IndexWriter indexWriter = new IndexWriter(fsDir, config);

        listAllFile(fileDir);
        long startTime = new Date().getTime();

        indexWriter.deleteAll();

        // 增加document到索引去
        for (File txtFile : fileList)
        {
            if (txtFile.isFile() && txtFile.getName().endsWith(".java"))
            {
                System.out.println(txtFile.getName());
                FileInputStream fis = null;
                try
                {
                    fis = new FileInputStream(txtFile);
                }
                catch (FileNotFoundException fnfe)
                {
                    continue;
                }

                try
                {
                    Document document = new Document();
                    Field fieldPath = new StringField("path", txtFile.getPath(), Field.Store.YES);
                    Field fieldBody = new TextField("body", new BufferedReader(new InputStreamReader(fis, "GBK")));

                    document.add(fieldPath);
                    document.add(fieldBody);
                    indexWriter.addDocument(document);
                }
                finally
                {
                    fis.close();
                }

                System.out.println("被索引文件:" + txtFile.getCanonicalPath());
            }
        }

        // 对索引进行优化
        indexWriter.forceMerge(10);

        indexWriter.close();

        // 测试一下索引的时间
        long endTime = new Date().getTime();
        System.out.println("索引耗费时间:" + (endTime - startTime) + " 毫秒!");
    }

}

 

package com.xiva.test.lucene;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Date;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

/**
 * 
 * 删除索引
 * @author xiva
 * @version [版本号, 2013-4-30]
 * @see [相关类/方法]
 * @since [产品、模块版本]
 */
public class IvIndexDelete
{
    public static void main(String[] args) throws Exception
    {
        File fileDir = new File("E:\\data\\lucene");
        File indexDir = new File("E:\\data\\index");
        
        Analyzer luceneAnalyzer = new SmartChineseAnalyzer(Version.LUCENE_42);
        
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_42,
                luceneAnalyzer);
        config.setOpenMode(org.apache.lucene.index.IndexWriterConfig.OpenMode.APPEND);
        
        Directory fsDir = new SimpleFSDirectory(indexDir);
        IndexWriter indexWriter = new IndexWriter(fsDir, config);
        File[] txtFiles = fileDir.listFiles();
        long startTime = new Date().getTime();
        
        // 增加document到索引去  
        for (int i = 0; i < txtFiles.length; i++)
        {
            if (txtFiles[i].isFile() && txtFiles[i].getName().endsWith("u.txt"))
            {
                FileInputStream fis = null;
                try
                {
                    fis = new FileInputStream(txtFiles[i]);
                }
                catch (FileNotFoundException fnfe)
                {
                    continue;
                }
                
                try
                {
                    
                    indexWriter.deleteDocuments(new Term("path",
                            txtFiles[i].getPath()));
                }
                finally
                {
                    fis.close();
                }
                
                System.out.println("被删除索引文件:" + txtFiles[i].getCanonicalPath());
            }
        }
        
        indexWriter.forceMerge(10);
        indexWriter.close();
        
        //测试一下索引的时间  
        long endTime = new Date().getTime();
        System.out.println("删除索引耗费时间:" + (endTime - startTime) + " 毫秒!");
    }
}

 

package com.xiva.test.lucene;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.util.Date;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

public class IvIndexUpdate
{
    public static void updateIndex() throws Exception
    {
        File fileDir = new File("E:\\data\\lucene");
        File indexDir = new File("E:\\data\\index");

        Analyzer luceneAnalyzer = new SmartChineseAnalyzer(Version.LUCENE_42);

        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_42, luceneAnalyzer);

        config.setOpenMode(org.apache.lucene.index.IndexWriterConfig.OpenMode.APPEND);

        Directory fsDir = new SimpleFSDirectory(indexDir);
        IndexWriter indexWriter = new IndexWriter(fsDir, config);
        File[] txtFiles = fileDir.listFiles();
        long startTime = new Date().getTime();

        // 增加document到索引去
        for (int i = 0; i < txtFiles.length; i++)
        {
            if (txtFiles[i].isFile() && txtFiles[i].getName().endsWith("u.txt"))
            {
                FileInputStream fis;
                try
                {
                    fis = new FileInputStream(txtFiles[i]);
                }
                catch (FileNotFoundException fnfe)
                {
                    continue;
                }

                try
                {
                    Document document = new Document();
                    Field fieldPath = new StringField("path", txtFiles[i].getPath(), Field.Store.YES);
                    Field fieldBody = new TextField("body", new BufferedReader(new InputStreamReader(fis, "GBK")));
                    
                    document.add(fieldPath);
                    document.add(fieldBody);

                    indexWriter.updateDocument(new Term("path", txtFiles[i].getPath()), document);
                }
                finally
                {
                    fis.close();
                }

                System.out.println("被更新索引文件:" + txtFiles[i].getCanonicalPath());
            }
        }

        indexWriter.forceMerge(10);
        indexWriter.close();

        // 测试一下索引的时间
        long endTime = new Date().getTime();
        System.out.println("更新索引耗费时间:" + (endTime - startTime) + " 毫秒!");
    }

    public static void main(String[] args) throws Exception
    {
        updateIndex();
    }
}

 

package com.xiva.test.lucene;

import java.io.File;
import java.io.IOException;
import java.util.Date;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
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.FSDirectory;
import org.apache.lucene.util.Version;

public class IvFileSearch
{
    public static void main(String[] args) throws IOException
    {
        String queryString = "索引";
        String field = "body";
        Query query = null;
        TopDocs docs = null;

        File indexDir = new File("F:\\WorkSpace\\EclipseProjects\\luceneIndex");
        IndexReader reader = DirectoryReader.open(FSDirectory.open(indexDir));
        IndexSearcher searcher = new IndexSearcher(reader);

        // StopFilterFactory factory = new StopFilterFactory();
        // factory.getStopWords()
        Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_42);

        try
        {
            long startTime = new Date().getTime();
            QueryParser qp = new QueryParser(Version.LUCENE_42, field, analyzer);
            query = qp.parse(queryString);

            long endTime = new Date().getTime();
            System.out.println("索引耗费时间:" + (endTime - startTime) + " 毫秒!");
        }
        catch (ParseException e)
        {
            e.printStackTrace();
        }

        if (searcher != null)
        {
            docs = searcher.search(query, 25);// 可以分页查询

            ScoreDoc scoreDocs[] = docs.scoreDocs;

            for (int i = 0; i < docs.totalHits; i++)
            {
                Document targetDoc = searcher.doc(scoreDocs[i].doc);
                String path = targetDoc.get("path");
                System.out.println("path:" + path);
            }
        }
    }
}

 

PS:对于数据库操作时,相信大家都有相关的方法去更新或者删除索引,比如及时更新或者使用定时扫描表的方法。数据库本身也具有全文索引的特性,比如Oracle和MSSQL。

 

对与文件的操作,我的解决方法是:可以采用 利用JNA对文件进行监听之观察者模式 这里给出的方法来更新或者删除索引。

分享到:
评论

相关推荐

    Lucene.NET全文索引搜索Demo项目

    这个"Lucene.NET全文索引搜索Demo项目"是一个实际应用示例,展示了如何在.NET环境中使用Lucene.NET进行全文索引和搜索操作。 首先,我们要理解什么是全文索引。全文索引是一种特殊的数据库索引,它允许用户通过输入...

    lucene全文检索简单索引和搜索实例

    《Lucene全文检索:简单索引与搜索实例详解》 Lucene是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...

    lucene 索引小示例

    《Lucene索引小示例解析》 Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。在Java编程环境中,Lucene被广泛应用于构建搜索功能,特别是对于大量文本数据的高效检索。本篇文章将通过一个简单的小...

    Lucene5学习之创建索引入门示例

    **Lucene5学习之创建索引入门示例** 在IT领域,搜索引擎的开发与优化是一项关键技术,而Apache Lucene作为一款高性能、全文本搜索库,是许多开发者进行文本检索的首选工具。本文将深入探讨如何使用Lucene5来创建一...

    Lucene之删除索引

    同时,`HelloLucene_delete`这个压缩包文件可能是某个示例项目,通过分析其中的代码,你可以更直观地了解Lucene删除索引的实现方式。 总之,Lucene的删除索引机制是一个复杂但高效的过程,涉及到了位向量、段管理和...

    lucene 站内搜索示例

    Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了强大的搜索功能,并且被广泛应用于各种项目中,包括网站站内搜索。本示例提供了使用 Lucene 实现站内搜索的具体步骤和代码示例,帮助开发者...

    Lucene全文搜索_LuceneJava全文搜索_

    在"Lucene全文搜索_LuceneJava全文搜索_"这个主题中,我们将深入探讨Lucene如何在Java环境中实现高效的全文搜索引擎。首先,Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)和搜索(Search)。...

    Lucene与数据库结合示例(加双关键字高亮)

    “Lucene与数据库结合示例(加双关键字高亮)”这个标题表明,我们将讨论如何将开源全文搜索引擎Lucene与关系型数据库MySQL整合在一起,并且在搜索结果中实现关键词高亮显示,以提升用户体验。这通常涉及到数据的...

    lucene4.4的搜索示例

    本示例项目“lucene4.4的搜索示例”旨在帮助开发者快速理解和使用 Lucene 的核心功能,包括索引构建、查询解析以及结果排序。 首先,我们来看索引构建过程。在 Lucene 中,数据并不是直接存储的,而是通过构建索...

    Lucene与DB结合示例

    Lucene是Apache软件基金会的开源全文检索库,它提供了强大的文本分析和索引构建能力。在本示例中,作者使用Spring和Struts1作为框架,MySQL作为后台数据存储。 1. **Lucene中文分词**: Lucene本身支持英文的分词...

    Lucene 4.8全文检索引擎入门示例文档

    在版本 4.8 中,Lucene 提供了强大的文本分析、索引构建和搜索功能,使得开发者能够轻松地在应用程序中集成高效的全文搜索引擎。本文将详细介绍 Lucene 4.8 的基本概念、关键组件以及如何通过实例进行入门。 一、...

    lucene示例 demo+jar包

    Lucene 是一个强大的全文检索库,通过索引、搜索、分析等机制,为开发者提供高效的数据搜索能力。"lucene示例"可以帮助初学者理解并实践 Lucene 的主要功能,而提供的 jar 包则是运行 Lucene 应用的基础。学习并掌握...

    lucene3.0.3搜索的使用示例

    4. **Document** 和 **Field** 类:Document是Lucene中的基本数据结构,代表一个要被索引的完整文档。每个文档包含多个Field,每个Field对应文档的一个属性或部分。 5. **IndexWriter**:用于创建或更新索引。你...

    lucene实现全文搜索

    以下是一个简单的Lucene索引创建示例: ```java Directory indexDir = FSDirectory.open(new File(INDEXDIR)); IndexWriter writer = new IndexWriter(indexDir, analyzer, true, MaxFieldLength.LIMITED); File ...

    Lucene 全文检索的 各种例子

    在这个“Lucene全文检索的各种例子”中,我们将探讨如何使用不同的分词器,如ikAnalyzer和smartChineseAnalyzer,来实现中文文本的索引和搜索。 首先,让我们深入理解一下Lucene。Lucene的核心功能包括文档的索引和...

    lucene 对 xml建立索引

    本文将详细介绍如何利用Lucene对XML文档进行索引建立的过程,并通过示例代码具体阐述其实现方法。 #### 二、基础知识 1. **Lucene简介** - Lucene是一个开源的全文搜索引擎库,能够帮助开发者构建应用程序内的搜索...

    Lucene索引器实例

    以下是一个简单的Java代码示例,展示了如何创建和使用Lucene索引器: ```java import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache....

    lucene全文索引

    这个“lucene全文索引”可能是包含Lucene的相关示例代码、文档或者配置文件,帮助用户更好地理解和使用Lucene。 **1. Lucene 的基本概念** - **索引**: 在Lucene中,索引是预处理步骤,将原始文本转换为倒排索引...

    Lucene示例 BM25相似度计算

    本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、执行查询,并比较默认的TF-IDF相似度与BM25相似度的区别。 首先,我们需要了解什么是Lucene。Lucene是一个由...

Global site tag (gtag.js) - Google Analytics