Lucene全文检索--实战篇

本文详细介绍了如何使用Lucene 4.10.3版本构建全文检索系统,包括配置开发环境、创建和查询索引库、索引库的删除及修改等核心操作。通过实例展示了如何在Eclipse IDE下,利用Java编程语言和Lucene相关jar包,实现文档的索引创建、查询、删除和更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、配置开发环境

版本:lucene4.10.3

Jdk要求:1.7以上

IDE:Eclipse

jar包:

 Lucene包:

   lucene-core-4.10.3.jar

   lucene-analyzers-common-4.10.3.jar

   lucene-queryparser-4.10.3.jar

 其它:

  commons-io-2.4.jar

  junit-4.9.jar

二、创建索引库

第一步:创建一个java工程,并导入jar包。

第二步:创建一个indexwriter对象。

  1. 指定索引库的存放位置Directory对象
  2. 指定一个分析器,对文档内容进行分析。

第二步:创建document对象。

第三步:创建field对象,将field添加到document对象中。

第四步:使用indexwriter对象将document对象写入索引库,此过程进行索引创建。并将索引和document对象写入索引库。

第五步:关闭IndexWriter对象。

//创建索引
	@Test
	public void createIndex() throws Exception {
		
		//指定索引库存放的路径
		Directory directory = FSDirectory.open(new File("D:\\temp\\0108\\index"));
		
		//创建一个标准分析器(分析器有很多种)
		Analyzer analyzer = new StandardAnalyzer();

		//创建indexwriterCofig对象
		//第一个参数: Lucene的版本信息,可以选择对应的lucene版本也可以使用LATEST
		//第二根参数:分析器对象
		IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);

		//创建indexwriter对象
		IndexWriter indexWriter = new IndexWriter(directory, config);

		//原始文档的路径
		File dir = new File("D:\\04.lucene\\01.参考资料\\searchsource");

		for (File f : dir.listFiles()) {
			//文件名
			String fileName = f.getName();
			//文件内容
			String fileContent = FileUtils.readFileToString(f);
			//文件路径
			String filePath = f.getPath();
			//文件的大小
			long fileSize  = FileUtils.sizeOf(f);

			//创建文件名域
			//第一个参数:域的名称
			//第二个参数:域的内容
			//第三个参数:是否存储
			Field fileNameField = new TextField("filename", fileName, Store.YES);
			//文件内容域
			Field fileContentField = new TextField("content", fileContent, Store.YES);
			//文件路径域(不分析、不索引、只存储)
			Field filePathField = new StoredField("path", filePath);
			//文件大小域
			Field fileSizeField = new LongField("size", fileSize, Store.YES);
			
			//创建document对象
			Document document = new Document();
			document.add(fileNameField);
			document.add(fileContentField);
			document.add(filePathField);
			document.add(fileSizeField);
			//创建索引,并写入索引库
			indexWriter.addDocument(document);
		}
		//关闭indexwriter
		indexWriter.close();
	}

【注意】Field域的属性

三、查询索引库

  生成的索引文件,可以使用Luke进行查看!使用很简单,这里面就不做介绍了!

 

四、 查询索引

第一步:创建一个Directory对象,也就是索引库存放的位置。

第二步:创建一个indexReader对象,需要指定Directory对象。

第三步:创建一个indexsearcher对象,需要指定IndexReader对象

第四步:创建一个TermQuery对象,指定查询的域和查询的关键词。

第五步:执行查询。

第六步:返回查询结果。遍历查询结果并输出。

第七步:关闭IndexReader对象

//查询索引库
	@Test
	public void searchIndex() throws Exception {

		//指定索引库存放的路径
		Directory directory = FSDirectory.open(new File("D:\\temp\\0108\\index"));

		//创建indexReader对象
		IndexReader indexReader = DirectoryReader.open(directory);

		//创建indexsearcher对象
		IndexSearcher indexSearcher = new IndexSearcher(indexReader);

		//创建查询
		Query query = new TermQuery(new Term("filename", "apache"));

		//执行查询
		//第一个参数是查询对象,第二个参数是查询结果返回的最大值
		TopDocs topDocs = indexSearcher.search(query, 10);

		//查询结果的总条数
		System.out.println("查询结果的总条数:"+ topDocs.totalHits);

		//遍历查询结果
		//topDocs.scoreDocs存储了document对象的id
		for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
			//scoreDoc.doc属性就是document对象的id
			//根据document的id找到document对象
			Document document = indexSearcher.doc(scoreDoc.doc);
			System.out.println(document.get("filename"));
			//System.out.println(document.get("content"));
			System.out.println(document.get("path"));
			System.out.println(document.get("size"));
		}
		//关闭indexreader对象
		indexReader.close();
	}

 【注意】

​​​​​​​   IndexSearcher搜索方法

​​​​​​​ TopDocs

该部分介绍的查询比较简单,后面会介绍复杂查询! 

五、​​​​​​​索引库删除

//删除全部索引
	@Test
	public void deleteAllIndex() throws Exception {
        //getIndexWriter 详见上文
		IndexWriter indexWriter = getIndexWriter();
		//删除全部索引
		indexWriter.deleteAll();
		//关闭indexwriter
		indexWriter.close();
	}
//根据查询条件删除索引
	@Test
	public void deleteIndexByQuery() throws Exception {
		IndexWriter indexWriter = getIndexWriter();
		//创建一个查询条件
		Query query = new TermQuery(new Term("filename", "apache"));
		//根据查询条件删除
		indexWriter.deleteDocuments(query);
		//关闭indexwriter
		indexWriter.close();
	}

六、​​​​​​​索引库的修改

//修改索引库
	@Test
	public void updateIndex() throws Exception {

		IndexWriter indexWriter = getIndexWriter();

		//创建一个Document对象
		Document document = new Document();

		//向document对象中添加域。
		document.add(new TextField("filename", "要更新的文档", Store.YES));
		document.add(new TextField("content", "2013年11月18日 - Lucene 简介", Store.YES));

		indexWriter.updateDocument(new Term("content", "java"), document);

		//关闭indexWriter
		indexWriter.close();
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值