`
zhoucl
  • 浏览: 49932 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

初次接触Lucene小记

阅读更多

这几天闲着没什么事,就鼓捣了一下Lucene的全文检索方面的内容,首先在Apache的Lucene站点 上大致浏览了一下Lucene的相关文档及知识,由于英文不怎么好,干脆直接找中文相关的内容看了,弄了两天,自己整了个Lucene的大致的实现程序,并且添加进自己的站点项目中,做了个简单的测试,出了一点效果,在这里将大致过程做个简单的记录:

1、在原有的maven项目上,增加了一个test-lucene的子模块,原有的与其相关的模块为test-persisit(主要做持久化操作),test-model(主要定义模型的模块), 大致的POM文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
        <artifactId>test</artifactId>
        <groupId>org.clzps</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

  <groupId>org.clzps</groupId>
  <artifactId>test-lucene</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>test-lucene</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <lucene.version>3.1.0</lucene.version>
  </properties>

  <dependencies>
  	<!-- 项目模块相关依赖 -->
  	<dependency>
  		<groupId>org.clzps</groupId>
  		<artifactId>test-model</artifactId>
  		<version>${project.version}</version>
  		<type>jar</type>
  	</dependency>
  	
  	<dependency>
  		<groupId>org.clzps</groupId>
  		<artifactId>test-persist</artifactId>
  		<version>${project.version}</version>
  		<type>jar</type>
  	</dependency>
  	
  	<dependency>
  		<groupId>org.apache.lucene</groupId>
  		<artifactId>lucene-analyzers</artifactId>
  		<version>${lucene.version}</version>
  		<type>jar</type>
  		<scope>compile</scope>
  	</dependency>
  	<dependency>
  		<groupId>org.apache.lucene</groupId>
  		<artifactId>lucene-core</artifactId>
  		<version>${lucene.version}</version>
  		<type>jar</type>
  		<scope>compile</scope>
  	</dependency>
  	<dependency>
  		<groupId>org.apache.lucene</groupId>
  		<artifactId>lucene-highlighter</artifactId>
  		<version>${lucene.version}</version>
  		<type>jar</type>
  		<scope>compile</scope>
  	</dependency>
  	<dependency>
  		<groupId>org.apache.lucene</groupId>
  		<artifactId>lucene-smartcn</artifactId>
  		<version>${lucene.version}</version>
  		<type>jar</type>
  		<scope>compile</scope>
  	</dependency>
  </dependencies>
</project>

 2、主要的Java文件内容,实现外部应用的直接调用,包括创建index过程,加载index过程(索引已经创建好),搜索过程,具体就不详细描述了,主要自己做记录,看代码:

public class LuceneService {
	/**
	 * Logger
	 */
//	private final Logger logger = Logger.getLogger(getClass());
	
	/**
	 * 分词器
	 */
	private static Analyzer analyzer = Constants.analyzer;
	
	public static void setAnalyzer(Analyzer analyzer) {
		LuceneServiceImpl.analyzer = analyzer;
	}
	
	/**
	 * 索引目录路径
	 */
	private static String indexDirPath = Constants.indexDirectoryPath;

	public static void setIndexDirPath(String indexDirPath) {
		LuceneServiceImpl.indexDirPath = indexDirPath;
	}
	
	/**
	 * Directory变量
	 */
	private static FSDirectory  fsdirectory  = null;
	private static RAMDirectory ramDirectory = null;
	
	private static IndexReader fsIndexReader  = null;
	private static IndexReader ramIndexReader = null;
	
	private void IndexRamToDisk() {
		IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_31, analyzer);
		iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
		IndexWriter fsIndexWriter = null;
		
		try {
			fsdirectory = FSDirectory.open(new File(indexDirPath));
			
			fsIndexWriter = new IndexWriter(fsdirectory, iwConfig);
			fsIndexWriter.addIndexes(new Directory[]{ramDirectory});
			fsIndexWriter.optimize();
			fsIndexWriter.close();
			
			//关闭ramDirectory
			ramDirectory.close();
			ramDirectory = null;
		} catch (CorruptIndexException e) {
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		loadIndex();
	}
	
	public void createIndex(List<ArticleData> objList) {
		IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_31, analyzer);
		iwConfig.setOpenMode(OpenMode.CREATE);
		IndexWriter ramIndexWriter = null;
		ramDirectory = new RAMDirectory();
		
		try {
			ramIndexWriter = new IndexWriter(ramDirectory, iwConfig);
			ramIndexWriter.deleteAll();
			ramIndexWriter.commit();
			
			for(int i = 0; i < objList.size(); i++) {
				Document doc = AnyObjects2DocumentUtils.Persist2Document(objList.get(i));
				ramIndexWriter.addDocument(doc);
				System.out.println(i);
			}
			ramIndexWriter.close();
			
			IndexRamToDisk();
		} catch (IOException e) {
			e.printStackTrace();
		}		
	}
	
	public void loadIndex() {
		try {
			if(fsdirectory == null) {
				fsdirectory = FSDirectory.open(new File(indexDirPath));
			}
			fsIndexReader = IndexReader.open(fsdirectory);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void search(String queryStr) {
		Long start = new Date().getTime();
		String[] fields = new String[]{"title","content"};
		try {
			Query query = new MultiFieldQueryParser(Version.LUCENE_31, fields, analyzer).parse(queryStr);
			MultiReader multiReader = null;
			
			if(fsIndexReader == null) return;
			
			if(ramIndexReader == null) {
				multiReader = new MultiReader(new IndexReader[]{fsIndexReader});
			} else {
				multiReader = new MultiReader(new IndexReader[]{fsIndexReader, ramIndexReader});
			}
			
			IndexSearcher indexSearcher = new IndexSearcher(multiReader);
			
			TopDocs topDocs = indexSearcher.search(query, null, 100);
			
			System.out.println("检索到【" + topDocs.totalHits + "】条匹配的结果!");
			System.out.println("--------------------------------------------------------");
			ScoreDoc[] scoreDoc = topDocs.scoreDocs;
			
			for(int i = 0; i < scoreDoc.length; i++) {
				Document document = indexSearcher.doc(scoreDoc[i].doc);
				Object2DocumentUtils.PrintDocument(document);
			}
			
			Long end = new Date().getTime();
			System.out.println("搜索时间:" + (end-start));
			
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 3、通过下面的测试代码,即可进行创建Index,加载Index和搜索过程了:

@Test
	public void testCreateOrLoadIndex() {
		
		File file = new File(indexDirectoryPath);
		if(file.exists()) {
			luceneService.loadIndex();
		} else {
			createIndex();
		}
		
		luceneService.search("事件");
	}

 

分享到:
评论

相关推荐

    lucene,lucene教程,lucene讲解

    lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....

    lucene3.0 lucene3.0

    lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0

    Lucene_in_Action(中文版).pdf

    Lucene_in_Action(中文版)....1. 接触 Lucene 2. 索引 3. 为程序添加搜索 4. 分析 5. 高极搜索技术 6. 扩展搜索 第二部分 Lucene 应用 7. 分析常用文档格式 8. 工具和扩充 9. Lucene 其它版本 10. 案例学习

    lucene in action

    无论是对于初次接触 Lucene 的新手还是已经有一定经验的开发者来说,都是一本非常有价值的参考书。通过阅读本书,不仅可以学习到如何使用 Lucene 构建高效的搜索系统,还能深入了解其背后的原理和技术细节。

    lucene 5.4.1 官方文档离线版

    Apache Lucene是一个高性能、全文本搜索库,由Java编写,被广泛用于开发搜索引擎和信息检索系统。这个离线版的Lucene 5.4.1官方文档提供了关于...无论是初次接触Lucene的新手,还是有经验的开发者,都能从中受益匪浅。

    lucene 数据库

    总的来说,这个压缩包提供了全面的Lucene学习资源,无论你是刚刚接触Lucene的新手,还是希望深化理解的开发者,都能从中受益。通过学习和实践,你将能够熟练运用Lucene构建高效的全文搜索引擎,解决大数据环境下的...

    Lucene时间区间搜索

    Lucene是一款强大的全文搜索引擎库,广泛应用于各种数据检索场景。在C#环境下,利用Lucene进行时间区间搜索是提高数据检索效率和精确度的重要手段。本篇将深入探讨如何在C#中实现Lucene的时间区间查询匹配,以及涉及...

    lucene-4.7.0全套jar包

    【Lucene 4.7.0 全套JAR包详解】 Lucene是一个开源全文搜索引擎库,由Apache软件基金会开发并维护。它提供了一个高级、灵活的文本搜索API,允许开发者轻松地在应用程序中实现复杂的搜索功能。这次提供的“lucene-...

    lucene in action英文版 lucene 3.30包

    《Lucene in Action》是关于Apache Lucene的权威指南,这本书深入浅出地介绍了全文搜索引擎的构建和优化。Lucene是一个高性能、全文本搜索库,它允许开发人员在应用程序中轻松实现复杂的搜索功能。这本书主要面向...

    Lucene3.5源码jar包

    本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...

    Annotated Lucene 中文版 Lucene源码剖析

    《Annotated Lucene 中文版 Lucene源码剖析》是一本深入探讨Apache Lucene的书籍,专注于源码解析,帮助读者理解这个强大的全文搜索引擎库的工作原理。Lucene是一款开源的Java库,它提供了高效的文本搜索功能,被...

    Lucene简介.介绍

    【Lucene 简介】 Lucene 是一个强大的开源全文搜索库,由 Java 编写,主要用于为应用程序添加全文检索功能。它不是一个完整的全文搜索引擎应用,而是一个工具包,允许开发者将其集成到自己的软件中,以实现高效、...

    Lucene示例 BM25相似度计算

    在IT领域,搜索引擎技术是至关重要的,而Lucene作为一个开源全文搜索引擎库,广泛应用于各种文本检索系统中。本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、...

    lucene3源码分析

    ### Lucene3源码分析知识点概述 #### 一、全文检索的基本原理 ##### 1. 总论 全文检索系统是一种高效的信息检索技术,能够帮助用户在海量文档中快速找到包含特定关键词的信息。Lucene是Java领域内最受欢迎的全文...

    lucene 2.0 api以及lucene 3.0 api

    **Lucene 2.0 API 和 Lucene 3.0 API 深度解析** Lucene 是一个由 Apache 软件基金会开发的全文搜索引擎库,它为开发者提供了在 Java 应用程序中实现高性能、可扩展的全文搜索功能的能力。Lucene 的 API 设计得相当...

    Lucene的原理完整版pdf

    **Lucene原理详解** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单但功能强大的API,用于索引和搜索文本数据,使得开发者可以轻松地在...

    计算机专业外文翻译(lucene相关)

    "计算机专业外文翻译(lucene相关)" 本文翻译了论文"Scale-up x Scale-out: A Case Study using Nutch/Lucene",介绍了计算机专业领域中关于Lucene相关的知识点。 Scale-up vs Scale-out 论文中讨论了两个相对...

    lucene所有的jar包

    《全面解析Lucene jar包:从基础到应用》 在信息技术高速发展的今天,搜索引擎已经成为我们获取信息不可或缺的工具。在Java领域,Lucene作为一个强大的全文搜索引擎库,深受开发者喜爱。本文将详细介绍“lucene所有...

Global site tag (gtag.js) - Google Analytics