使用Lucene实现多个文档关键词检索demo(二)

上次在使用Lucene建立索引时使用的时自带的StandAnalyzer分词器,而这个分词器在对中文进行分词时只是机械的按字进行划分,因此使用它lucene就不能很好的对中文索引,也就不能实现对中文关键词的检索了,因此其实上次的实践只能对英文进行。

为了解决这个问题,可以使用IKAnalyzer,它是以开源项目Lucene为应用主体的,结合词典分词和文法分析算法的中文分词组件。它支持中英文等分词。

接下来就用它来改善检索功能,首先是下载IKAnalyzer开发包,我将开发包上传到了这里密钥:7j78这个包我已经实践过,之前下别的版本会与最新的lucene产生冲突。包里面有jar包,两个配置文件以及使用文档的pdf,一个配置文件是用来配置扩展字典以及需要过滤的无意义词的字典,另一个则是直接在里面写上需要过滤哪些无意义词。

下面的代码是分别用StandAnalyzer和IKAnalyzer对同一个中文字符串分别进行分词

public static void analysis(){
		Analyzer luceneAnalyzer = new StandardAnalyzer();//分词工具
		try {
			TokenStream tokenStream=luceneAnalyzer.tokenStream("","明天就是国庆节了");
			   CharTermAttribute term=tokenStream.getAttribute(CharTermAttribute.class);
			   tokenStream.reset();
		        //遍历分词数据
		        while(tokenStream.incrementToken()){
		            System.out.print(term.toString()+"|");
		        }
		        tokenStream.clearAttributes();
		        tokenStream.close();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void analysisByIK() throws IOException{
		String text="明天就是国庆节了";
		IKSegmenter ik = new IKSegmenter(new StringReader(text),true);
		Lexeme lexeme = null;
	    while((lexeme = ik.next())!=null){
	    	System.out.print(lexeme.getLexemeText()+"|");
	    }
	}

运行结果如下:

明|天|就|是|国|庆|节|了|

明天|就是|国庆节|了|

可以看到IKAnalyzer分词的结果更加符合期望。

下面代码是使用IKAnalyzer在建立文档索引时替换原先的StandAnalyer。

public static void buildIndex(String idir,String dDir)throws IOException{
		File indexDir = new File(idir);// 索引存放目录
		File dataDir = new File(dDir);// 需要建立索引的文件目录
		Analyzer luceneAnalyzer = new IKAnalyzer();//分词工具
		File[] dataFiles = dataDir.listFiles();
		IndexWriterConfig indexConfig = new IndexWriterConfig(Version.LATEST, luceneAnalyzer);
		FSDirectory fsDirectory = null;
		IndexWriter indexWriter = null;
		try {
			fsDirectory = FSDirectory.open(indexDir);// 索引目录
			indexWriter = new IndexWriter(fsDirectory, indexConfig);// 用于创建索引的对象
			long startTime = new Date().getTime();
			for (int i = 0; i < dataFiles.length; i++) {
				if (dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")) {
					Document document = new Document();//代表一个文档
					System.out.println(dataFiles[i].getPath());
					Reader txtReader = new FileReader(dataFiles[i]);
					FieldType fieldType = new FieldType();
					fieldType.setIndexed(true);
					document.add(new TextField("path",dataFiles[i].getCanonicalPath(),Store.YES));//Field是用来描述文档的属性,比如这里文档设置了两个属性,路径和内容
					document.add(new Field("contents", txtReader, fieldType));
					indexWriter.addDocument(document);
				}
			}
			indexWriter.commit();//为文档建立索引
			long endTime = new Date().getTime();
			System.out.println("It takes " + (endTime - startTime) + " milliseconds to create index for the files in directory " + dataDir.getPath());
		} catch (IOException e) {
			e.printStackTrace();
			try {
				indexWriter.rollback();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		} finally {
			if(indexWriter!=null){
				indexWriter.close();
			}
		}
	}

时间: 2024-07-28 12:53:52

使用Lucene实现多个文档关键词检索demo(二)的相关文章

使用Lucene实现多个文档关键词检索demo(一)

在进行demo前先到http://www.ibm.com/developerworks/cn/java/j-lo-lucene1/了解关于lucene的一些基本概念,忽略其中的代码实例,因为年代久远,而我的这篇文档正是补充其中代码部分. 了解了基本概念后,接下来就可以开始完成demo了. 首先在http://www.apache.org/dyn/closer.cgi/lucene/java/4.10.0下载lucene包,这里我使用的是最新的4.10版,由于最新版与网上其他lucene使用dem

dedecms批量删除文档关键词可以吗

这几天在重新整服务器,几个站点都是用dedecms搭建的,版本相对比较早,虽然都已经打了补丁,但客户还是在纠结,所以就下载了新的系统进行搭建(注意编码要和原来的一样),导入数据,一切安好,可发现后台有很多的文档关键词都是不相关的,以其这样不如直接删除,问题来了,几百条数据,一页页删到什么时候,怎么批量删除呢? DELETE FROM dede_keywords 一行代码轻松搞定. 如果想批量删除搜索关键词呢?也是可以实现的 Delete from dede_search_cache; Delet

Lucene是如何理解文档的 & 文档类型(Types)是如何被实现的

Lucene是如何理解文档的 在Lucene中,一份文档(Document)由一系列简单的字段-值(field-value)对组成.一个字段必须有值,同时允许包含多值.同样的,一个单一的字符串在分析处理过程中可能被转换成多个值.Lucene不关心值到底是字符串.数字还是日期--所有的值都以不可理解的比特值(opaque)对待. 当我们在Lucene中索引一份文档时,值和字段在反向索引(inverted index)中被关联起来.可选项的是,是否将原始值存储起来以便今后使用,存储后的值是不可更改的

Python TF-IDF计算100份文档关键词权重

上一篇博文中,我们使用结巴分词对文档进行分词处理,但分词所得结果并不是每个词语都是有意义的(即该词对文档的内容贡献少),那么如何来判断词语对文档的重要度呢,这里介绍一种方法:TF-IDF. 一,TF-IDF介绍 TF-IDF(Term Frequency–Inverse Document Frequency)是一种用于资讯检索与文本挖掘的常用加权技术.TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度.字词的重要性随着它在文件中出现的次数成正比增加,

Spring3.0官网文档学习笔记(二)

1.3 使用场景 典型的成熟的spring web应用 spring使用第三方框架作为中间层 远程使用场景 EJB包装 1.3.1 依赖管理.命名规则(包) spring-*.jar *号代表的是模块的简写,如:spring-core, spring-webmvc, spring-jms 可以在四个不同的地方找到Spring: http://www.springsource.org/downloads/community  所有的jar包被打包成zip,名称从3.0开始是: org.spring

跟着文档学python(二):time.time() 与 time.clock() 的对比与总结

一,两个函数的文档: 1,time.time(): time.time() Return the time in seconds since the epoch as a floating point number. Note that even though the time is always returned as a floating point number, not all systems provide time with a better precision than 1 sec

微软office web apps 服务器搭建之在线文档预览(二)

上一篇文章已经介绍了整个安装过程了.只要在浏览器中输入文档转换server的ip,会自动跳转,出现如下页面. 那么就可以实现本地文档预览了,你可以试试.(注意:是本地哦,路径不要写错,类似“\\file\share”.如果不能预览,那么还要注意文档的权限哦,不多说.) 看到这个,就算完成80%以上的工作了,那么现在只需要集成到自己的项目中. 以下也主要是参考:http://www.cnblogs.com/poissonnotes/p/3277280.html 这篇文章也是超级经典.(上篇安装的也

产品需求文档的学习记录(二)

我们将概念想法形成了信息结构,罗列出了产品的所有信息内容,现在我们就要依据信息结构,开始规划产品的功能需求,绘制出产品结构图和用户流程图.首先我们要规划出产品的频道及子频道.子模块或子页面.(如下图) 图注:讲解一下我对于这个思维导图的名词理解1.频道:某一个同性质的功能或内容的共同载体,也可称为功能或内容的类别.2.子频道:某频道下细分的另一类别3.页面:单个或附属某个频道或分类下的界面4.模块:页面中多个元素组成的一个区域内容,可以有一个或多个,也可以循环出现(例如:文章列表)5.模块元素:

90. 基于Notes/Domino的文档工作流系统(二)

XPages下的工作流演示 网页外观的可能性在技术上超过Notes客户端里的表单,Web应用程序在页面设计上花费的精力和取得的效果也远远超过基本保持传统客户端应用程序界面风格的Notes.我是程序员,不是设计师.在下面的演示里,页面都以展现功能为主,基本采用XPages的默认输出. 按状态分类显示采购单的视图: 采购单页面: 单击Flow actions-按钮弹出的对话框: 流程设置 先来看看这个采购系统的流程图. 在客户端里选择导航中的FlowSettings,看到的是配置文档的全景. 双击视