文档章节

lucene 3.5.0 入门笔记

6pker
 6pker
发布于 2015/02/26 11:43
字数 550
阅读 210
收藏 0

1. lucene-3.5.0.jar

2. 新建目录C:\testsource,新建目录C:\testindex。

3.在C:\testsource下新建test1.txt, test2.txt,内容分别为:“商务休闲品牌男装西裤衬衫”,“潮流休闲品牌女装裙子大衣”。

4.创建索引

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;

/**
 * 给text文件建立索引
 * @author liam.huang@foxmail.com
 */
public class TextFileIndexer {
	
	public static void main(String[] args) throws Exception{
		
		//text文件路径
		File sourceDir = new File("C:\\testsource");
		File[] sourceFiles = sourceDir.listFiles();
		
		//索引文件路径
		File indexDir = new File("C:\\testindex");
		Directory indexFilesDir = FSDirectory.open(indexDir);
		
		//构建analyzer
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
		
		//配置IndexWriter
		IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_35, analyzer);
		iwConfig.setOpenMode(OpenMode.CREATE);
		
		//构建IndexWriter
		IndexWriter indexWriter = new IndexWriter(indexFilesDir, iwConfig);
		
		long startTime = new Date().getTime();
		for(int i=0; i<sourceFiles.length; i++){
			if(sourceFiles[i].isFile() && sourceFiles[i].getName().endsWith(".txt")){
				System.out.println("\nFile " + sourceFiles[i].getCanonicalPath() + "正在被索引......");
				String temp = fileReaderAll(sourceFiles[i].getCanonicalPath(), "UTF-8");
				System.out.println(temp);
				Field FieldPath = new Field("path", sourceFiles[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 document = new Document();
				document.add(FieldPath);
				document.add(FieldBody);
				indexWriter.addDocument(document);
			}
		}
		
		//关闭IndexWriter
		indexWriter.close();
		
		long endTime = new Date().getTime();
		System.out.println("\n花费了" + (endTime-startTime) + " 毫秒把文档增加到索引里面去!索引文件地址:" + sourceDir.getPath());
	}

	//读取文件所有内容
	private static String fileReaderAll(String filePath, String charset) throws IOException {
		String line = new String();
		String temp = new String();
		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), charset));
		while((line=reader.readLine())!=null){
			temp += line;
		}
		reader.close();
		return temp;
	}

}

输出结果:


File C:\testsource\test1.txt正在被索引......
商务休闲品牌男装西裤衬衫

File C:\testsource\test2.txt正在被索引......
潮流休闲品牌女装裙子大衣

花费了569 毫秒把文档增加到索引里面去!索引文件地址:C:\testsource



5.关键字检索


import java.io.File;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

/**
 * 关键字检索
 * @author liam.huang@foxmail.com
 */
public class TextQuery {
	
	public static void main(String[] args) throws Exception{
		
		String queryString = "休闲 装";

		//索引文件路径
		String indexDir = "C:\\testindex";
		IndexReader indexReader = IndexReader.open(FSDirectory.open(new File(indexDir)));
		IndexSearcher indexSearcher = new IndexSearcher(indexReader);
		
		Query query = null;
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
		QueryParser queryParser = new QueryParser(Version.LUCENE_35, "body", analyzer);
		queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
		query = queryParser.parse(queryString);
		
		ScoreDoc[] hits = null;
		if(indexSearcher!=null){
			//返回最多为10条记录 
			TopDocs results = indexSearcher.search(query, 10);
			hits = results.scoreDocs;
			if(hits.length>0){
				System.out.println("找到:" + hits.length + " 个结果!");
			}else{
				System.out.println("没有找到");
			}
			indexSearcher.close();
		}
		
	}

}

输出结果:


找到:2 个结果!






© 著作权归作者所有

共有 人打赏支持
6pker
粉丝 52
博文 97
码字总数 59252
作品 0
浦东
程序员
私信 提问
Lucene 3.5和Solr 3.5:大幅降低内存用量、SearcherManager和深度分页支持

Lucene项目管理委员会宣布Apache Lucene 3.5.0和Apache Solr 3.5.0已经可以使用。Lucene是一个高性能、支持全文搜索的文本搜索开发库。Solr是一个独立的搜索服务器,其核心使用了Lucene来做索...

墙头草
2012/02/03
3.5K
7
Apache Lucene 3.5 发布,Java 搜索引擎

Apache Lucene 3.5 发布了,该版本包含大量的bug修复、优化以及改进,下载地址: http://www.apache.org/dyn/closer.cgi/lucene/java 完整改进内容请看下载后的 CHANGES.txt 文件。 Lucene 3...

红薯
2011/11/27
3.9K
5
Apache Solr 3.5 发布,全文搜索服务器

Apache Solr 3.5 发布了,该版本主要是配合 Lucene 3.5 版本而发布。 下载地址:http://www.apache.org/dyn/closer.cgi/lucene/solr 值得关注的改进内容有: Bug fixes and improvements fro...

红薯
2011/11/27
1K
0
Infinispan 7.0.0.Alpha4 发布

Infinispan 7.0.0 Alpha 4 发布了,值得关注的改进有: * HotRod 协议支持认证和 SKIP_CACHE_LOAD 参数; * Distributed entry iterator 可以迭代集群中所有条目; * 可使用查询 DSL 来进行对象...

红薯
2014/05/21
1K
2
Lucene In Action 读书笔记(一)

简介 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和...

林俊龙
2013/09/04
0
1

没有更多内容

加载失败,请刷新页面

加载更多

eslint rules 规则

'rules': { "comma-dangle": ["error", "never"], //是否允许对象中出现结尾逗号 "no-cond-assign": 2, //条件语句的条件中不允许出现赋值运算符 "no-console": 2, //不允许出现console语句 ...

agenyun
29分钟前
1
0
类型判断时instanceof和equals的不同用法

接口设计时为了避免序列化的麻烦,将接口定义为参数为map<String,String>类型的接口,但是现在调用时需要转换当前的实体Bean为Map,接口接收方再把Map转换为另一个Bean实体。过程中的需要对类...

wangtx
35分钟前
1
0
vue 组件间传值(个人精编)

1.父组件向子组件传值 1⃣️.子组件标签绑定需要传递的参数名2⃣️.子组件页面使用props 接收参数 2.子组件向父组件传值  1⃣️.子组件使用$emit来触发一个自定义事件,并传递一个参...

MrBoyce
45分钟前
1
0
(荷兰)彼得·冯·门施著:博物馆学研究的目的

博物馆学研究的目的 (荷)彼得·冯·门施 尽管诸多关于博物馆学认知目的的不同看法可以被归纳为数个主要群体,但没有一个群体可以被称为“学派”。一般来说,学派是由于博物馆学研究目的的不...

乔老哥
55分钟前
2
0
Vue slot的用法

之前看官方文档,由于自己理解的偏差,不知道slot是干嘛的,看到小标题,使用Slot分发内容,就以为 是要往下派发内容。然后就没有理解插槽的概念。其实说白了,使用slot就是先圈一块地,将来...

peakedness丶
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部