使用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使用demo在API上有很多差异,因此能够找到实例比较少,只能通过查看官方API来学习如何使用。

lucene4.10 API地址:http://lucene.apache.org/core/4_10_0/core/index.html

将下载后的压缩包解压后,将core和analysis目录下的jar包丢进项目path即可。

接下来就是编码

首先建立问指定目录下的所有文档建立索引,代码如下(具体解释见代码注释):

	public static void buildIndex(String idir,String dDir)throws IOException{
		File indexDir = new File(idir);// 索引存放目录
		File dataDir = new File(dDir);// 需要建立索引的文件目录
		Analyzer luceneAnalyzer = new StandardAnalyzer();//分词工具
		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();//代表一个文档
					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();
			}
		}
	}

接下来就是使用建立好的索引来检索关键字,代码如下:

public static void search(String queryStr) throws IOException {
		File indexDir = new File("/home/luzhen/lucenceIndex");
		FSDirectory fsDirectory = FSDirectory.open(indexDir);// 存放索引的目录
		IndexReader indexReader = DirectoryReader.open(fsDirectory);
		IndexSearcher searcher = new IndexSearcher(indexReader);
		if (!indexDir.exists()) {
			System.out.println("The Lucene index is not exist");
			return;
		}
		Term term = new Term("contents", queryStr);//搜索的基本单位
		TermQuery luceneQuery = new TermQuery(term);//基本的一个查询类
		TopDocs doc = searcher.search(luceneQuery, 10);//使用query进行查询,10为限制返回的结果
		for (int i = 0; i < doc.totalHits; i++) {//当有检索到结果时进入循环,打印出文档路径
			Document docHit = searcher.doc(doc.scoreDocs[i].doc);
			System.out.println(docHit.get("path"));
		}
	}
时间: 2024-10-07 14:35:33

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

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

上次在使用Lucene建立索引时使用的时自带的StandAnalyzer分词器,而这个分词器在对中文进行分词时只是机械的按字进行划分,因此使用它lucene就不能很好的对中文索引,也就不能实现对中文关键词的检索了,因此其实上次的实践只能对英文进行. 为了解决这个问题,可以使用IKAnalyzer,它是以开源项目Lucene为应用主体的,结合词典分词和文法分析算法的中文分词组件.它支持中英文等分词. 接下来就用它来改善检索功能,首先是下载IKAnalyzer开发包,我将开发包上传到了这里密钥:7j

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是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度.字词的重要性随着它在文件中出现的次数成正比增加,

分布式搜索elasticsearch 索引文档的检索 入门

1.首先将如下数据提交到ES中建立索引 {"number":32768,"singer":"杨坤","size":"5109132","song":"今夜二十岁","tag":"中国好声音","timelen":319} {"number":32769,"singer"

webAPI 加注释生成帮助文档和测试demo

转自https://blog.csdn.net/a123_z/article/details/71078062 1:配置 接口注释. (1)配置生成xml的路径.我们在项目上面点右键→属性→生成标签页配置xml的路径. (2)在xml的读取路径:在Areas\HelpPage\App_Start\HelpPageConfig.cs里面配置xml的读取路径. config.SetDocumentationProvider(new XmlDocumentationProvider(HttpConte

dedecms文档长尾关键词,根据频率先替换长尾关键词再替换主关键词

问题:在使用dedecms的文档关键词替换功能时,会造成交叉替换 如: 长尾关键词1:男人喝金丝皇菊有什么好处? 长尾关键词2:喝金丝皇菊有什么好处? 主关键词3:金丝皇菊 使用系统默认的功能时,在替换主关键词的时候,会将上面已经替换好的长尾关键词中的“金丝皇菊”也替换掉,从而破坏了原有的长尾关键词锚文本. 解决思路: 1.先将要替换的关键词替换成类似: 关键词1:'#####0#####' 关键词2:'#####2#####' 关键词3:'#####3#####' 再进行以上替换操作的时候,我

DedeCMSV57数据库结构文档(数据字典)

表名:dede_addonarticle(ENGINE=MyISAM/CHARSET=gbk)   字段名 说明描述 具体参数 aid 文章ID mediumint(8) unsigned NOT NULL default '0' typeid 栏目ID smallint(5) unsigned NOT NULL default '0' body 内容 mediumtext redirecturl 跳转URL varchar(255) NOT NULL default '' templet 自定

POI加dom4j将数据库的数据按一定格式生成word文档

一:需求:将从数据库查处来的数据,生成word文档,并有固定的格式.(dom4j的jar包+poi的jar包) 二:解决:(1)先建立固定格式的word文档(2007版本以上),另存成为xml文件,作为模板.(修改xml节点,添加属性,用于标示要填固定数据的节点) (2)dom4j解析模板xml文件,将文件读入内存,并把数据库数据写入内存的xml模型中 (3)利用poi将内存中的含有数据库内容的xml模型转换成word内存模型,利用输出流输出word文档 三:DEMO [1]模板的word文档