这里面用的是比较新的Lucene4.10.2 做的一个实例。(lucene的索引不能太大,要不然效率会很低。大于1G的时候就必须考虑分布索引的问题)

先介绍一下Lucene的几个参数意义:

IndexWriter:lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。

Analyzer:分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。

Directory:索引存放的位置;lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectory和RAMDirectory两个类。

Document:文档;Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。

Field:字段。

IndexSearcher:是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具;

Query:查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。

QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。

话说Lucene就两个重要步骤,一个是创建索引,一个是查询索引,首先看下如何创建索引的代码。

import util.IOUtil;
/**
* @author ${朱良兴}
*2015-1-26
*/
public class CreateIndexer { public void createIndex() throws Exception{ IOUtil utils= new IOUtil();
// 一、创建索引
// 内存索引模板
Directory dir = new RAMDirectory();
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_2,
analyzer);
IndexWriter indexWriter = new IndexWriter(dir, config);
//文件位置。
File fileDir = new File( "E:\\ftp" );
String path = "E:\\ftp";
long startTime = new Date().getTime();
String id;
//获取所有的文件名。
List <String> fileList = utils.getFileName(path);
for(int i=0; i<fileList.size();i++){
String content = utils.getFileContent(new File(fileList.get(i)), "GBK");
id ="id"+i;
indexPost(id, content);
} // 测试一下索引的时间
long endTime = new Date().getTime();
System.out .println( " 这花费了 " + (endTime - startTime) + " 毫秒来把文档增加到索引里面去! " + fileDir.getPath());
indexWriter.close(); }
@SuppressWarnings("deprecation")
private static void indexPost(String id,String content){
/* 这里放索引文件的位置 */
File indexDir = new File("E:\\index");
Analyzer analyzer = new IKAnalyzer();
TextField postIdField = new TextField("id", id, Store.YES); // 不要用StringField
TextField postContentField = new TextField("content", content, Store.YES); Document doc = new Document();
doc.add(postIdField);
doc.add(postContentField);
IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_4_10_2, analyzer);
iwConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
try {
Directory fsDirectory = FSDirectory.open(indexDir);
IndexWriter indexWriter = new IndexWriter(fsDirectory, iwConfig);
indexWriter.addDocument(doc);
indexWriter.close();
} catch (Exception e) {
e.printStackTrace();
} }

第二就是查询:

/**
* 查询索引
* @author ${朱良兴}
*2015-1-26
*/
public class DoSearch {
public static void main(String[] args) throws Exception {
//创建索引
CreateIndexer createIndexer = new CreateIndexer();
createIndexer.createIndex();
Analyzer analyzer = new IKAnalyzer();
File indexDir = new File("E:\\index");
try {
Directory fsDirectory = FSDirectory.open(indexDir);
DirectoryReader ireader = DirectoryReader.open(fsDirectory);
IndexSearcher isearcher = new IndexSearcher(ireader);
QueryParser qp = new QueryParser("content", analyzer); //使用QueryParser查询分析器构造Query对象
qp.setDefaultOperator(QueryParser.AND_OPERATOR);
Query query = qp.parse("么么哒"); // 搜索Lucene
long beginTime = new Date().getTime();
TopDocs topDocs = isearcher.search(query , 100); //搜索相似度最高的100条记录
long endTime = new Date().getTime();
System.out.println("命中:" + topDocs.totalHits);
System.out.println("搜索花费的时间:"+(endTime-beginTime)+"毫秒");
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (int i = 0; i < topDocs.totalHits; i++){
Document targetDoc = isearcher.doc(scoreDocs[i].doc);
System.out.println("内容:" + targetDoc.toString());
} } catch (Exception e) { }
}
}

用到的工具类代码:

package util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List; /**
* IO 工具类。
* @author ${朱良兴}
*2015-1-26
*/
public class IOUtil{ List<String> fileList = new ArrayList<String>();
/**
* 根据文件的全路径获得所有的文件内容
* @param fileName
* @param charset
* @return
* @throws Exception
*/
public String getFileContent(File fileName, String charset) throws Exception{
BufferedReader reader = new BufferedReader( new InputStreamReader(
new FileInputStream(fileName), charset));
String line = new String();
String temp = new String();
while ((line = reader.readLine()) != null ) {
temp += line;
}
reader.close();
return temp;
}
/**
* 获取所有的文件名
* @param path
* @return
* @throws Exception
*/
public List<String> getFileName(String path) throws Exception{ String filenName ="";
//文件位置。
File fileDir = new File(path);
File[] textFiles = fileDir.listFiles();
if (textFiles!=null){ // 增加document到索引去
for ( int i = 0 ; i < textFiles.length; i ++ ) {
if (textFiles[i].isFile()) {
System.out.println( " File " + textFiles[i].getCanonicalPath()
+ " 正在被索引. " );
filenName=textFiles[i].getCanonicalPath();
fileList.add(filenName); }else{ getFileName(textFiles[i].getCanonicalPath());
}
}
}
return fileList; }
}

这里是和IK Analyzer  结合使用的简单示例

Lucene 4.10.2开发示例的更多相关文章

  1. DevExpress .NET界面开发示例大全

    说到做.net界面开发,很多人应该都会想到DevExpress. 它的 .net界面开发系列一共有7个版本:WinForms.ASP.NET.MVC.WPF.Silverlight.Windows 8 ...

  2. Padrino 博客开发示例

    英文版出处:http://www.padrinorb.com/guides/blog-tutorial 楼主按 拿作者自己的话说:Padrino(谐音:派骓诺)是一款基于Sinatra的优雅的Web应 ...

  3. SharePoint 2013 APP 开发示例 (二)获取用户信息

    SharePoint 2013 APP 开发示例 (二)获取用户信息 这个示例里,我们将演示如何获取用户信息: 1. 打开 Visual Studio 2012. 2. 创建一个新的  SharePo ...

  4. SharePoint 2013 APP 开发示例 (六)服务端跨域访问 Web Service (REST API)

    上个示例(SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API))是基于JavaScript,运行在web browser内去访问REST AP ...

  5. SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API)

          虽然 JQuery 也能通过授权header实现跨域, 但SharePoint 提供了更简单的方法,它被实现在SP.RequestExecutor里 .它能访问跨域的服务包括REST AP ...

  6. SharePoint 2013 APP 开发示例 (四)JQuery访问REST

    这个示例里,我们将用JQuery AJAX去发送一个 REST请求,并查看返回结果.为了让我们更好地理解REST 接口,我们将添加一个输入框让用户可以指定REST的URL, 这将让我们尝试着用构造的U ...

  7. SharePoint 2013 APP 开发示例 (三)使用远程的web资源

    在这个示例里我们将详细介绍 TokenHelper 类, 我们将看到它是怎么简单地从远程web站点访问SharePoint的.我们还将取到它的一些值.这将帮助我们理解连接是怎么被构造的,同时也方便我们 ...

  8. Fedora 10编程开发工具

    1请问Fedora 10编程开发工具有什么 编辑器就用vim,编译用gcc,当然个人爱好随意 IDE的话推荐eclipse,如果做C/C++的,用codeblocks也是个不错的选择 输入gcc -v ...

  9. 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析和开发示例

    AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...

随机推荐

  1. SGU 163.Wise King

    一道题目长的水题.... 总结就一句话,给出n个(-3~3)的数,一个数m,取任意个数是使这些数的m次幂之和最大. code #include <iostream> #include &l ...

  2. 泛型? extents super

    ?可以接受任何泛型集合,但是不能编辑集合值.所以一般只在方法参数中用 例子: ? extends Number  则类型只能是Number类的子孙类 ? super String  则类型只能是Str ...

  3. cocod2d-x 之 CCTMXTiledMap & CCTMXLayer

    cocos2dx框架自带的地图CCTMXTiledMap,继承自CCNode.CCTMXTiledMap的坐标系的原点位于左上角,以一个瓦片为单位,换句话说,左上角第一块瓦片的坐标为(0,0),而紧挨 ...

  4. iOS的launch image --备用

    当我们打开一款应用程序的时候,首先映入眼帘的往往并不是程序的主界面,而是经过精心设计的欢迎界面,这个界面通常会停留几秒钟,然后消失.看似很平常的一个小小的欢迎界面,其实还大有讲究. 一.为什么会出现欢 ...

  5. 【转】常见 jar包详解

    转载自:http://www.cnblogs.com/xusir/archive/2013/05/19/3086878.html   jar包 用途 axis.jar SOAP引擎包 commons- ...

  6. vss报错Workgroup无法访问,您可能没有权限使用网络资源解决办法

    xp下访问svn或者vss的时候只能使用ip进行访问表示很不爽,昨天还好好的,结果就不能使用计算机名字去访问了. 很是郁闷,打开网上邻居之后发现,居然连网上邻居都搜不出来,于是关掉windows自带防 ...

  7. AOP小结

    AOP主要采用代理模式来实现的,静态代理(设计模式中的代理模式),动态代理(反射机制,实现InvocationHandler接口),cglib实现(采用继承方式,针对目标类生成子类,并覆盖方法进行增强 ...

  8. C#导出数据的EXCEL模板设计

    一:将如下图中,查询出来的数据导出到EXCEL中 二:Excel的状态 三:设计的背后工作 四:最后一步,隐藏

  9. QTP关于AOM的Javascript启动方式

    序 QTP的AOM模型想必大家都很熟悉了,平时常用的就是通过VBS脚本的方式编写启动程序(也是我现在用的方法).其实,还有很多其他的方式,如Java,C#,JS,这些语言都是通过调用QTObjectM ...

  10. datagridview bindingsource刷新数据

    调用bindindsource的ResetBindings() 方法