第一部分:Lucene建立索引

Lucene建立索引主要有以下两步:
第一步:建立索引器
第二步:添加索引文件
准备在f盘建立lucene文件夹,然后在lucene下建立文件夹test和index两个文件夹。
在test文件夹下建立如下四个txt文件
a.txt 内容:中华人民共和国
b.txt 内容:人民共和国
c.txt 内容:人民
d.txt 内容:共和国

这四个文件就是我们要建立索引的文件,
Index文件夹作为索引结果输出文件夹

准备工作完成以后,我们开始建立索引。
第一步:建立索引器,如下
IndexWriter writer = new IndexWriter("f:\\lucene\\index",
      new StandardAnalyzer(), true);
第二步:添加索引文件
writer.addDocument(..);
具体完整代码如下:
package com.peng.mylucene;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
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;
public class LuceneIndex {
public static void main(String[] args) {
   try {
    LuceneIndex index = new LuceneIndex();
    Date start = new Date();
    index.writeToIndex();
    Date end = new Date();
    System.out.println("建立索引用时" + (end.getTime() - start.getTime())+" 毫秒");
    index.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
}
//索引器
private IndexWriter writer = null;
public LuceneIndex() {
   try {
    //建立索引器,指定索引存放目录,分析器--new StandardAnalyzer()
    writer = new IndexWriter("f:\\lucene\\index",
      new StandardAnalyzer(), true);
   } catch (Exception e) {
    e.printStackTrace();
   }
}
private Document getDocument(File f) {
   //将要建立索引的文件构造成Document对象,并添加域content
   Document doc = new Document();
   BufferedReader bufReader = null;
   try {
    bufReader = new BufferedReader(new InputStreamReader(
      new FileInputStream(f)));
   } catch (FileNotFoundException e) {
    e.printStackTrace();
   }
   //添加内容
   doc.add(Field.Text("contents", bufReader));
   doc.add(Field.Keyword("path", f.getAbsolutePath()));
   return doc;
}
private void writeToIndex() {
   //将目录f:\\lucene\\test下的文件,先通过getDocument(File)函数,
   //构造成Document, 然后添加到索引器writer
   File folder = new File("f:\\lucene\\test");
   if (folder.isDirectory()) {
    File[] list = folder.listFiles();
    for (File f : list) {
     Document doc = getDocument(f);
     try {
      System.out.println("建立索引:" + f);
      writer.addDocument(doc);
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
   }
}
private void close() {
   try {//关闭索引器
    writer.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
}
}
最后,执行程序,结果如下:
建立索引:f:\lucene\test\a.txt
建立索引:f:\lucene\test\b.txt
建立索引:f:\lucene\test\c.txt
建立索引:f:\lucene\test\d.txt
建立索引用时63 毫秒
在f:\lucene\index下发现索引结果文件
_4.cfs deletable segments

第二部分:在索引上搜索入门实例
在索引上搜索主要包括个步骤,使用两个对象—IndexSearcher和Query。
检索步骤:
第一步:创建索引器
searcher = new IndexSearcher(IndexReader.open("f:\\lucene\\index"));
第二步:将待检索关键字打包成Query对象
query = QueryParser.parse(key, "contents", new StandardAnalyzer());
第三步:使用索引器检索Query,得到检索结果Hits对象
Hits hit = searcher.search(query);
最后,将检索到的结果Hits打印出来:
for (int i = 0; i < h.length(); ++i) {
   Document doc = h.doc(i);
   System.out.println("这是第 " + i + " 个检索到的结果,文件名为:"
        + doc.get("path"));
}
全部程序如下:
package com.peng.mylucene;
import java.io.IOException;
import java.util.Date;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
public class LuceneSearch {
public static void main(String[] args) {
   LuceneSearch test = new LuceneSearch();
   Hits hit = null;// new Hits();
   hit = test.search("中华");
   test.dispalyResult(hit);
   hit = test.search("人民");
   test.dispalyResult(hit);
   hit = test.search("共和国");
   test.dispalyResult(hit);
}
public LuceneSearch() {
   try {// IndexReader.open()指名索引所在文件夹
    searcher = new IndexSearcher(IndexReader.open("f:\\lucene\\index"));
   } catch (IOException e) {
    e.printStackTrace();
   }
}
// 声明IndexSearcher对象
private IndexSearcher searcher = null;
// 声明Query对象
private Query query = null;
public Hits search(String key) {
   System.out.println("正在检索关键字:" + key);
   try {// 将关键字包装为Query对象
    query = QueryParser.parse(key, "contents", new StandardAnalyzer());
    Date start = new Date();
    Hits hit = searcher.search(query);
    Date end = new Date();
    System.out.println("检索完成,用时:" + (end.getTime() - start.getTime())
      + " 毫秒");
    return hit;
   } catch (Exception e) {
    e.printStackTrace();
   }
   return null;
}
public void dispalyResult(Hits h) {
   if (h.length() < 1) {
    System.out.println("no result !");
    return;
   } else {
    for (int i = 0; i < h.length(); ++i) {
     try {
      Document doc = h.doc(i);
      System.out.println("这是第 " + i + " 个检索到的结果,文件名为:"
        + doc.get("path"));
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
    System.out.println("----------------------");
   }
}
}

在执行第一部分的程序得到索引后,执行搜索程序LuceneSearch,在控制台下得到结果如下:
(对比我们在f:\lucene\test下的四个文件可知,检索结果正确)
正在检索关键字:中华
检索完成,用时:47 毫秒
这是第 0 个检索到的结果,文件名为:f:\lucene\test\a.txt
----------------------
正在检索关键字:人民
检索完成,用时:0 毫秒
这是第 0 个检索到的结果,文件名为:f:\lucene\test\c.txt
这是第 1 个检索到的结果,文件名为:f:\lucene\test\b.txt
这是第 2 个检索到的结果,文件名为:f:\lucene\test\a.txt
----------------------
正在检索关键字:共和国
检索完成,用时:0 毫秒
这是第 0 个检索到的结果,文件名为:f:\lucene\test\d.txt
这是第 1 个检索到的结果,文件名为:f:\lucene\test\b.txt
这是第 2 个检索到的结果,文件名为:f:\lucene\test\a.txt
----------------------

总结
通过以上两篇文章我们看以看到使用lucene建立索引过程主要有一下4步:
1.提取文本
2.构建Document
3.分析
4.建立索引

参考《征服ajax+lucene构建搜索引擎》(转自:http://hi.baidu.com/peng3409)

Lucene建立索引搜索入门实例的更多相关文章

  1. 【转】Lucene不同版本中Field的Keyword、UnIndex,导致lucene 建立索引总是报错 急!!

    lucene 建立索引 总是报错 急!! http://zhidao.baidu.com/link?url=iaVs9JH4DfN6iwaWImt7VMJENWCWGGaWFGPjqhUw_jz7Fs ...

  2. lucene 建立索引的过程

    时间 -- ::  CSDN博客 原文 http://blog.csdn.net/caohaicheng/article/details/ 看lucene主页(http://lucene.apach ...

  3. Lucene4.9学习笔记——Lucene建立索引

    基本上创建索引需要三个步骤: 1.创建索引库IndexWriter对象 2.根据文件创建文档Document 3.向索引库中写入文档内容 这其中主要涉及到了IndexWriter(索引的核心组件,用于 ...

  4. lucene建立索引的过程

    建立索引过程 用户提交数据=>solr建立索引=>调用lucene包建立索引 官方建立索引和查询索引的例子如下: http://lucene.apache.org/core/4_10_3/ ...

  5. lucene 建立索引的不同方式

    1.创建一个简单的索引: package lia.meetlucene; import java.io.File; import org.apache.lucene.document.Document ...

  6. 建立spring项目入门实例

    建立maven项目 打开pop.xml文件 添加springframework所依赖的包 <!-- https://mvnrepository.com/artifact/org.springfr ...

  7. html抽取文本信息-java版(适合lucene建立索引)

    import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.beans.StringBe ...

  8. 利用Lucene将被索引文件目录中的所有文件建立索引

    1.新建两个文件夹htm和index,其中htm中存放被索引的文件,index文件中存放建立的索引文件. 2.新建解析目录中所有文件的类,用来解析指定目录下的所有文件. import java.io. ...

  9. Lucene实现索引和查询

    0引言 随着万维网的发展和大数据时代的到来,每天都有大量的数字化信息在生产.存储.传递和转化,如何从大量的信息中以一定的方式找到满足自己需求的信息,使之有序化并加以利用成为一大难题.全文检索技术是现如 ...

随机推荐

  1. virtualBox安装centos7并配置nginx php mysql运行环境

    virtualBox安装centos7并配置nginx php mysql运行环境 一:virtualBox安装centos7并进行基础设置 1.下载dvd.iso安装文件,下载地址:https:// ...

  2. C++ 字符串分割函数 str_split

    void str_split(const std::string & src, const std::string & sep, std::vector<std::string& ...

  3. hdu 1348 Wall (凸包模板)

    /* 题意: 求得n个点的凸包.然后求与凸包相距l的外圈的周长. 答案为n点的凸包周长加上半径为L的圆的周长 */ # include <stdio.h> # include <ma ...

  4. iOS开发-为我们的项目添加头文件prefix header

    在XCode6新建项目时,不再自动创建头文件,因此我们需要手动添加. 点击我们的项目->Build Settings -> all -> 搜索“prefix” -> 修改pre ...

  5. oracle闪回某个时间段的数据

    闪回2013-08-08 08:08:08的数据: insert into  table_1   select * from table_2 as of timestamp to_date('2013 ...

  6. 查看电脑CPU核心数的方法

    查看电脑CPU核心数的方法: 方法一: 同时按下[Ctrl+Shift+Esc]组合快捷键打开任务管理器: 点击[性能]就可以看出是几核CPU了: 方法二: 在计算机图标上面点击右键,选择“管理”: ...

  7. 牛散NO.3:MACD放之四海 假作真时真亦假

    大宗商品日线“异曲同工夺命勾魂枪” 话说有实战意义的技术在任何资本市场里都能产生出神奇的效果.不能说放之四海皆准,但至少起到触类旁通的“牵强”吧.大宗商品特别是在国际市场交易的大宗 商品由于是来自各方 ...

  8. 转: android emulator 命令详解

    在命令行输入: emulator -help,即可显示emulator支持的所有命令. Android Emulator usage: emulator [options] [-qemu args] ...

  9. VS2013-解决VS2013 4996错误

    由于微软在VS2013中不建议再使用C的传统库函数scanf,strcpy,sprintf等,所以直接使用这些库函数会提示C4996错误,在源文件中添加以下指令就可以避免这个错误提示. )

  10. angular总结控制器的三种主要职责: 为应用中的模型设置初始状态 通过$scope对象把数据模型或函数行为暴露给视图 监视模型的变化,做出相应的动作

    m1.双向数据绑定: <body> <div ng-app ng-init="user.name='world'"> <h1>使用NG实现双边数 ...