`
zhaohuafei
  • 浏览: 28266 次
文章分类
社区版块
存档分类
最新评论

Lucene使用之构建索引、查询

 
阅读更多
package cn.zhf.lucene;

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

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.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class TextFileIndexer {
    public static void main(String[] args) throws IOException {
        // 被索引的文件
        File dirFile = new File("c:/users/zhf/desktop/toindex");
        // 索引结果文件
        File indexFile = new File("c:/users/zhf/desktop/indexed");
        //索引文件的存放位置,由子类获取真实路径
        Directory directory = FSDirectory.open(indexFile);
        // 标准分析器
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
        IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_36,
                analyzer);
        iwc.setOpenMode(OpenMode.CREATE);
        //写索引:是索引过程的核心组件,这个类负责创建新索引或打开已有的索引。提供索引文件的写入操作
        IndexWriter iw = new IndexWriter(directory, iwc);
        File[] files = dirFile.listFiles();//要索引的文件列表
        long startTime = new Date().getTime();

        //将索引文件添加到结果目录中(indexFile)
        for (int i = 0; i < files.length; i++) {
            if (files[i].isFile() && files[i].getName().endsWith(".txt")) {
                System.out.println(files[i].getCanonicalPath() + "正在被索引");
                String temp = readFile(files[i].getCanonicalPath(), "GBK");
                System.out.println(temp);
                //域的集合
                Document document = new Document();
                //创建路径域
                Field fieldPath = new Field("path", files[i].getPath(),
                        Field.Store.YES, Field.Index.NO);
                //创建文本域
                Field fieldBody = new Field("body", temp, Field.Store.YES,
                        Field.Index.ANALYZED,
                        Field.TermVector.WITH_POSITIONS_OFFSETS);
                document.add(fieldPath);
                document.add(fieldBody);
                iw.addDocument(document);
            }
        }
        iw.close();
        long endTime = new Date().getTime();
        System.out.println("索引时间是: " + (startTime - endTime)
                + dirFile.getPath());

    }

    // 读取文件内容,将文件内容拼成一个字符串返回
    public static String readFile(String fileName, String charset)
            throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream(new File(fileName))));
        String str = "";
        String ret = "";
        while ((str = br.readLine()) != null)
            ret += str;
        br.close();
        return ret;
    }

}
package cn.zhf.lucene;


import java.io.File;
import java.io.IOException;


import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.Explanation;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;


public class TestQuery {


  public static void main(String[] args) throws CorruptIndexException, IOException, ParseException {
    String indexed = "c:/users/zhf/desktop/indexed";
    //用于搜索IndexWriter创建的索引
    IndexReader ir = IndexReader.open(FSDirectory.open(new File(indexed)));
    IndexSearcher is = new IndexSearcher(ir);
    ScoreDoc[] hits = null;
//    String keyword = "lucene";
//    Query query = null;
//    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
//    QueryParser qp = new QueryParser(Version.LUCENE_36,"body",analyzer);
//    query = qp.parse(keyword);
    //Term是搜索对象的基本单元,与Field类似
    Query q = new TermQuery(new Term("body","lucene"));
    if(is != null){
      //一个指针容器,指向前N个排名的搜索结果
      TopDocs top = is.search(q, 10);//返回最多10条记录
      hits = top.scoreDocs;
      if(hits.length>0)
        System.out.println("找到了 "+hits.length+" 条记录。");
      for(ScoreDoc d : hits){
        Document d1 = is.doc(d.doc);
        System.out.println(d1.get("path"));
        Explanation explanation = is.explain(q, d.doc);
        System.out.println("------------");
        System.out.println(explanation.toString());
      }
      is.close();
    }
  }


}


分享到:
评论

相关推荐

    lucene 对 xml建立索引

    - Lucene的核心能力在于文档索引和查询,它提供了强大的API来实现高效的文档检索。 2. **XML简介** - XML(Extensible Markup Language,可扩展标记语言)是一种用来标记数据的语言,它定义了用于描述结构化文档...

    基于lucene技术的增量索引

    通过上述步骤,我们可以构建一个基于Lucene的增量索引系统,高效地处理数据变化,同时保持搜索效率。在实际应用中,还需要结合具体的业务需求和数据特性进行定制化开发。通过持续监控和优化,我们可以确保系统的稳定...

    lucene实现索引查询

    以下是关于使用Lucene实现索引查询的详细知识: ### 一、创建索引 创建索引是Lucene的核心过程,它涉及到以下步骤: 1. **定义索引目录**:首先,你需要指定一个目录来存储索引文件。这通常是一个文件夹,可以...

    Lucene 索引的简单使用

    本篇文章将详细阐述如何使用Lucene来创建和查询索引,帮助你深入理解其核心概念和操作流程。 ### 1. Lucene基本概念 - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段...

    基于lucene的Swing全文索引构建于查询工具及源程序

    5. **搜索(Search)**:用户输入查询后,Lucene会使用查询解析器(Query Parser)将查询字符串转化为搜索表达式,然后在索引中进行匹配。搜索结果按相关性排序返回。 Swing是Java的一个图形用户界面(GUI)工具包...

    Lucene索引和查询

    **Lucene索引和查询** Lucene是Apache软件基金会的开放源码全文搜索引擎库,它提供了文本检索的核心工具,使得开发者能够快速构建自己的搜索应用。本项目中的代码旨在展示如何利用Lucene对多个文件夹下的数据进行...

    Lucene之删除索引

    在深入探讨Lucene删除索引这一主题之前,我们先来理解一下Lucene的基本概念。Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。它提供了高性能、可扩展的搜索和索引功能,广泛应用于各种应用程序中,如...

    lucene.net 2.9.2 实现索引生成,修改,查询,删除实例

    在这个实例中,我们将深入探讨如何使用Lucene.NET 2.9.2来实现索引的生成、修改、查询和删除。 **一、索引生成** 首先,我们需要创建一个索引,这是全文检索的基础。在Lucene.NET中,我们通常会定义一个文档类,...

    lucene 索引小示例

    在创建索引时,Lucene会对文档进行分词,生成一系列的关键词(也称为术语或Token),然后构建倒排索引。倒排索引是一种数据结构,它将每个关键词与包含该关键词的文档位置相关联,使得我们可以迅速找到包含特定词汇...

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

    3. 构建查询:使用QueryParser或者QueryBuilder创建查询对象,指定查询字段和查询字符串。 4. 执行搜索:调用IndexSearcher的search方法,传入查询对象和TopDocs参数,获取匹配的文档及其分数。 5. 处理结果:遍历...

    Lucene5学习之增量索引(Zoie)

    总结起来,Lucene5学习之增量索引(Zoie)涉及到的关键技术点包括: 1. 基于Lucene的增量索引解决方案:Zoie系统。 2. 主从复制架构:Index Provider和Index User的角色。 3. 数据变更追踪:通过变更日志实现增量索引...

    Lucene索引器实例

    以上就是Lucene索引器实例的基本介绍,通过这个实例,我们可以理解到如何使用Lucene来创建、管理和搜索文本索引。在实际项目中,可以根据需求选择合适的存储(如硬盘目录或分布式存储)、优化分析器配置、处理大量...

    Lucene3.0创建索引

    它为开发者提供了构建搜索应用所需的所有基本工具,包括索引文档、执行查询、处理分析等。Lucene3.0是该系列的一个版本,在性能和稳定性方面都有所提升。 #### 二、创建索引的基本步骤 根据提供的描述,创建索引的...

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

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

    Lucene建立索引及查询包含“java”关键字 示例代码

    通过这些代码,我们可以学习到Lucene的核心概念,包括索引构建、分词分析和查询执行,这对于理解全文检索系统的工作原理非常有帮助。在实际应用中,可以根据具体需求调整Analyzer和QueryParser的设置,以满足更复杂...

    lucene3.0庖丁+索引搜索程序

    Lucene的核心包括索引构建、倒排索引、查询解析和结果排序等关键部分。3.0版本相比之前的版本,在性能和稳定性上有了显著提升,同时引入了新的特性和优化。 二、庖丁解牛:Lucene3.0内部机制 1. 文档索引:Lucene...

    lucene 4.7.2 Demo

    Lucene的强大之处在于其灵活的查询能力。除了基本的关键词查询,Lucene还支持布尔查询、短语查询、模糊查询等。在4.7.2版本中,Lucene引入了通用对象搜索,这意味着你可以根据自定义的对象类型进行搜索,这极大地...

    深入 Lucene 索引机制

    2. CQRS(Command Query Responsibility Segregation):在处理索引构建和查询时,Lucene分别采用了不同的数据结构和算法,体现了CQRS的思想。 3. 工具支持:Lucene提供了丰富的工具和API,如Luke工具可以查看索引...

    Lucene.net高速创建索引

    数据查询可能涉及到SQL语句的编写,确保查询结果符合构建索引的需求。接着,数据会被转化为Lucene.NET支持的文档对象,每个文档对象对应数据库中的一个记录。这些文档对象包含了待索引的字段,如标题、内容等,这些...

    Lucene3.0之查询类型详解

    - **向量模型**:使用查询词和文档之间的向量表示,通过计算相似度来决定文档的相关度,支持精确匹配和部分匹配。 3. **查询流程**: - 用户输入查询请求。 - 对查询词进行词频统计和格式化。 - 使用索引进行...

Global site tag (gtag.js) - Google Analytics