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

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 对 xml建立索引 建立索引就是怎么简单 呵呵

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

    基于lucene的Swing全文索引构建于查询工具及源程序,有源程序以及做好的工具,非常适合初学者学习学习lucene

    lucene:lucene构建索引,从HelloWorld到项目具体使用

    lucene构建索引,从HelloWorld到项目具体使用 ====================项目一:=================================== qianjun.lucene.first ====================项目二:=================================== qianjun....

    lucene 索引小示例

    NULL 博文链接:https://blaiu.iteye.com/blog/588054

    Lucene检索文本,建立索引

    用Lucene检索文本,建立索引,用struts构建web程序框架

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

    根据博客调试的程序,比较简单,英文分词和检索,希望对大家学习有帮助。

    有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题[整理].pdf

    有关Lucene的问题(8):用Lucene构建实时索引的文档更新问题[整理].pdf

    使用lucene构建一个简单的搜索引擎

    全文检索首先将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的目的。这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-...这是一个使用lucene开源框架编写的一个简单的搜索功能

    lucene 7索引查看工具 -luke-7.2.0-luke-release.zip

    Luke是一个方便的索引查看和诊断工具,可以访问Lucene构建的索引文件,显示和修改某些索引内容。luke 7.2.0 支持最新的 lucene7 索引查看 github地址:https://github.com/DmitryKey/luke/releases

    lucene索引

    基于数据库的lucene3。索引构建类代码

    Lucene示例 BM25相似度计算

    用lucene 4.7.1做的一个Lucene构建索引、进行查询,对比默认的相似度计算与BM25相似度计算输出结果的示例。内容不多,供新手参考

    lucene-query-string-builder:使用基本功能构建复杂的Lucene查询字符串

    使用小型纯函数轻松构建您的Lucene字符串查询。 想象一下,有一个利用Lucene在(索引的)数据库上执行查询的API。 在这种情况下,您可能希望在客户端/前端上生成lucene查询字符串。 用法部分显示了如何利用此库...

    全文检索 lucene

    作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为...

    论文研究-基于XML和Lucene构建黄页搜索引擎 .pdf

    基于XML和Lucene构建黄页搜索引擎,姜伟,宋茂强,随着用户对搜索引擎要求的不断提高,垂直搜索引擎应运而生,成为搜索引擎新的发展趋势。论文基于开源全文索引引擎工具包Lucene,采

    Lucene中的FST算法描述

    描述了Lucene中如何使用FST算法构建term的内存索引,使用了很多图,直观的展现了FST图的构建流程,能够对想了解lucene内部实现机制原理的同学有帮助。

    Lucene文件检索实战项目

    Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为其内部全文检索子系统的...

    lucene例子

    Lucene 强大的 API 主要关注文本索引和搜索。它可以用于为各种应用程序构建搜索功能,比如电子邮件客户端、邮件列表、Web 搜索、数据库搜索等等。Wikipedia、TheServerSide、jGuru 和 LinkedIn 等网站都使用了 ...

    浅谈MySQL和Lucene索引的对比分析

    MySQL和Lucene都可以对数据构建索引并通过索引查询数据,一个是关系型数据库,一个是构建搜索引擎(Solr、ElasticSearch)的核心类库。两者的索引(index)有什么区别呢?以前写过一篇《Solr与MySQL查询性能对比》,...

    基于Lucene_Heritrix的垂直搜索引擎的研究与应用

    Lucene是一个用Java写的全文索引引擎工具包,访问索引时间快,支持多用户访问,可以跨平台使用。Heritrix是一个由Java开发的、开源的Web网络爬虫,用户可以使用它从网络上抓取想要的资源。探讨了Lucene和Heritrix在构建...

    【信息检索课程设计】sdu新闻网站全站爬取+索引构建+搜索引擎

    索引构建 对上一步爬取到的网页进行结构化预处理,包括基于模板的信息抽取、分字段解析、分词、构建索引等。 检索排序 对上一步构建的索引库进行查询,对于给定的查询,给出检索结果,明白排序的原理及方法。 2 运行...

Global site tag (gtag.js) - Google Analytics