A simple example about full-text search based Java:Lucene

索引源代码:
package lucene;

/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author Shirley
* @version 1.0
*/

import org.apache.lucene.index.*;
import org.apache.lucene.analysis.*;
import java.io.*;
import org.apache.lucene.document.*;

public class IndexFiles {
  //使用方法:: IndexFiles [索引输出目录] [索引的文件列表] ...
  public static void main(String[] arg) throws Exception {
    String[] args = new String[2];
    //索引后存放索引信息的路径
    args[0] = System.getProperty("java.io.tmpdir", "tmp") + System.getProperty("file.separator") + "index-1";
    //待索引文件
    args[1] = "E:\\AppWork\\lucene\\rfc2047.txt";
    args[2] = "E:\\AppWork\\cyberoffice\\CO\\Sheldon Java Mail.htm";
    args[3] = "E:\\AppWork\\lucene\\englishtest.doc";
    args[4] = "E:\\AppWork\\cyberoffice\\CO\\xls1.xls";
    args[5] = "E:\\AppWork\\cyberoffice\\CO\\ppt1.ppt";

    String indexPath = args[0];
    IndexWriter writer;
    //用指定的语言分析器构造一个新的写索引器(第3个参数表示是否为追加索引)
    writer = new IndexWriter(indexPath, new SimpleAnalyzer(), false);

    for (int i=1; i<args.length; i++) {
      System.out.println("Indexing file " + args[i]);
      InputStream is = new FileInputStream(args[i]);

      //构造包含2个字段Field的Document对象
      //一个是路径path字段,不索引,只存储
      //一个是内容body字段,进行全文索引,并存储
      Document doc = new Document();
      doc.add(Field.UnIndexed("path", args[i]));
      doc.add(Field.Text("body", (Reader) new InputStreamReader(is)));
      //将文档写入索引
      writer.addDocument(doc);
      is.close();
    };
    //关闭写索引器
    writer.close();
  }
}

搜索源代码:
package lucene;

/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author Shirley
* @version 1.0
*/

import org.apache.lucene.search.*;
import org.apache.lucene.queryParser.*;
import org.apache.lucene.analysis.*;

public class Search {
  public static void main(String[] arg) throws Exception {
    String[] args = new String[2];
    //索引后存放索引信息的路径
    args[0] = System.getProperty("java.io.tmpdir", "tmp") + System.getProperty("file.separator") + "index-1";
    //搜索關鍵字
    args[1] = "sending";

    String indexPath = args[0];
    String queryString = args[1];

    //指向索引目录的搜索器
    Searcher searcher = new IndexSearcher(indexPath);
    //查询解析器:使用和索引同样的语言分析器
    Query query = QueryParser.parse(queryString, "body", new SimpleAnalyzer());
    //搜索结果使用Hits存储
    Hits hits = searcher.search(query);
    //通过hits可以访问到相应字段的数据和查询的匹配度
    for (int i=0; i<hits.length(); i++) {
      System.out.println(hits.doc(i).get("path") + "; Score: " +  hits.score(i));
    };
  }
}

注:目前程序只支持英文索引,可以过滤文件类型为.txt  .doc  .htm  .xls  .ppt

中文索引及其它类型文件的索引正在研究中......

时间: 2024-12-03 05:53:03

A simple example about full-text search based Java:Lucene的相关文章

sql server-用全文检索(full text search)在一篇文章中搜任何字符串,使含有此此字符串的句子出现

问题描述 用全文检索(full text search)在一篇文章中搜任何字符串,使含有此此字符串的句子出现 有一个特定的要求就是返回的每一句话新成一行: 同意不同形的比如搜go,含有went, going, gone 的句子也要出现: 这样的代码怎么写? 我原本想用sql先把文章的每一句话找出来但是这样好慢: 求大神赐教 解决方案 这个需要你的全文索引库支持这种词法分析

MongoDB源码解析:Full Text Search Index

框架实现 FTS本质上也是Btree索引类型 索引AccessMethod定义: class FTSAccessMethod : public BtreeBasedAccessMethod 关键成员: fts::FTSSpec _ftsSpec; 获取索引的函数入口: void FTSAccessMethod::getKeys(const BSONObj& obj, BSONObjSet* keys) { ExpressionKeysPrivate::getFTSKeys(obj, _ftsSp

Entity Framework 中使用SQL Server全文索引(Full Text Search)

GitHub:https://github.com/fissoft/Fissoft.EntityFramework.Fts   EntityFramework中原来使用全文索引有些麻烦,需要使用DbContext.Database.SqlQuery或Execute去直接执行SQL.那样不能靠编译来检查读法错误,重构也不方便. 不过EF6增加Interceptor,可以执行前置和后置操作. Eg: public class FtsInterceptor : IDbCommandIntercepto

NHibernate.Search:基于Lucene.NET的全文索引

NHibernate.Search现在是NHiberante Contrilb下面的一个还没有发布的项目,也是从 Hibernate.Search移植而来,把NHibernate和Lucene.NET结合在一起,ORM持久化对象到数据库 中,Lucene.NET提供索引及查询支持. 下面在实际使用一下NHibernate.Search的使用: 由于这个项目还没有发布,它的很多特性也是一直在变化,所以现在只是以我下载的版本为准,如果你想 尝试此项目,请下载最下面的代码,里面包括自己编译生成的NHi

sublim text java-sublime text2 java 无法输入数据

问题描述 sublime text2 java 无法输入数据 import java.util.*; public class Test { public static void main(String args[]) { Scanner in=new Scanner(System.in); float a=in.nextFloat(); System.out.println(a); int b=in.nextInt(); System.out.println(b); } } 比如我这个代码,c

基于lucene搜索引擎的Hibernate Search,官方文档翻译

由于自己的项目需要用到搜索引擎,于是想到使用lucene,封装了lucene的框架有compass,solr,hibernate search. 网上对这些框架的描述有: Compass:是在Lucene的基础上做了封装,支持索引事务控制和增量索引,同时也能够和主流的SSH框架完美地整合在一起,操作Compass类似于操作Hibernate,它们的类/方法等设计的非常相似. 项目主页:http://www.compass-project.org/ 该项目已经很久没有更新维护了,官方网站显示最后维

Sublime Text 3 文本编辑器

 1.安装下载 下载地址:http://www.cr173.com/soft/121149.html http://www.xiazaiba.com/html/24343.html   官网 http://www.sublimetext.com/ Sublime Text 2 设置文件详解:http://linux.cn/article-799-1.html Sublime Text 2 文档:http://baelabs.duapp.com/Sublime/.https://github.co

java.text.format 将字符串“060503”转化为06:05:03或者将&amp;quot;20081002102030“转化为2008-10-02 10:00:30

直接贴代码,不解释: package com.chapter.five.one.tcn; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class TestDate2 { public static void main(String[] args) throws ParseException

Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP

Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它们的确是不太一样的.因此,我们运行了一个基准测试来对常用的几个JSON库进行了测试,看看在解析不同大小的文件时哪个库的速度是最快的.下面我会把结果分享给大家. JSON通常用于传