lucene学习笔记(4)---索引库的维护

一、索引库的添加

步骤

向索引库中添加document对象。

第一步:先创建一个indexwriter对象

第二步:创建一个document对象

第三步:把document对象写入索引库

第四步:关闭indexwriter。

//添加索引
	@Test
	public void addDocument() throws Exception {
		//索引库存放路径
		Directory directory = FSDirectory.open(new File("D:\\temp\\0108\\index"));
		
		IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, new IKAnalyzer());
		//创建一个indexwriter对象
		IndexWriter indexWriter = new IndexWriter(directory, config);
		//创建一个Document对象
		Document document = new Document();
		//向document对象中添加域。
		//不同的document可以有不同的域,同一个document可以有相同的域。
		document.add(new TextField("filename", "新添加的文档", Store.YES));
		document.add(new TextField("content", "新添加的文档的内容", Store.NO));
		document.add(new TextField("content", "新添加的文档的内容第二个content", Store.YES));
		document.add(new TextField("content1", "新添加的文档的内容要能看到", Store.YES));
		//添加文档到索引库
		indexWriter.addDocument(document);
		//关闭indexwriter
		indexWriter.close();
		
	}

二、索引库的删除

1、删除全部索引

@Test
	public void deleteAllIndex() throws Exception {
		IndexWriter indexWriter = getIndexWriter();
		//删除全部索引
		indexWriter.deleteAll();
		//关闭indexwriter
		indexWriter.close();
}

2、根据条件删除索引库的索引

扫描二维码关注公众号,回复: 2589381 查看本文章
@Test
	public void deleteByQuery() throws Exception {
		IndexWriter indexWriter = getIndexWriter();
		Term term = new Term("fileName","apache");
		//删除的条件
		TermQuery query = new TermQuery(term);
		//根据条件删除
		indexWriter.deleteDocuments(query);
		//关闭indexWriter
		indexWriter.close();
	}

三、索引库的查询

首先封装两个方法,用来指定索引库和输出内容

//执行查询的结果
		public void printResult(IndexSearcher indexSearcher,org.apache.lucene.search.Query query)throws Exception{
			// 第五步:执行查询。
			TopDocs topDocs = indexSearcher.search(query, 10);
			// 第六步:返回查询结果。遍历查询结果并输出。
			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
			for (ScoreDoc scoreDoc : scoreDocs) {
				int doc = scoreDoc.doc;
				Document document = indexSearcher.doc(doc);
				// 文件名称
				String fileName = document.get("fileName");
				System.out.println(fileName);
				// 文件内容
				String fileContent = document.get("fileContent");
				System.out.println(fileContent);
				// 文件大小
				String fileSize = document.get("fileSize");
				System.out.println(fileSize);
				// 文件路径
				String filePath = document.get("filePath");
				System.out.println(filePath);
				System.out.println("------------");
			}
		}
//IndexReader  IndexSearcher
		public IndexSearcher getIndexSearcher() throws Exception{
			// 第一步:创建一个Directory对象,也就是索引库存放的位置。
			Directory directory = FSDirectory.open(new File("D:\\lucene\\index"));// 磁盘
			// 第二步:创建一个indexReader对象,需要指定Directory对象。
			IndexReader indexReader = DirectoryReader.open(directory);
			// 第三步:创建一个indexsearcher对象,需要指定IndexReader对象
			return new IndexSearcher(indexReader);
	}
		

1、查询所有的索引

//查询所有
	@Test
	public void testMatchAllDocsQuery() throws Exception {
		IndexSearcher indexSearcher = getIndexSearcher();
		Query query = new MatchAllDocsQuery();
		System.out.println(query);
		printResult(indexSearcher, query);
		//关闭资源
		indexSearcher.getIndexReader().close();
	}

2、根据数值的范围查询

//根据数值范围查询
	@Test
	public void testNumericRangeQuery() throws Exception {
		IndexSearcher indexSearcher = getIndexSearcher();
		
		Query query = NumericRangeQuery.newLongRange("fileSize", 47L, 200L, false, true);
		System.out.println(query);
		printResult(indexSearcher, query);
		//关闭资源
		indexSearcher.getIndexReader().close();
	}

3、组合条件查询

@Test
		public void testBooleanQuery() throws Exception {
			IndexSearcher indexSearcher = getIndexSearcher();
			
			BooleanQuery booleanQuery = new BooleanQuery();
			
			TermQuery query1 = new TermQuery(new Term("filename","apache"));
			TermQuery query2 = new TermQuery(new Term("filename","lucene"));
			//  select * from user where id =1 or name = 'safdsa'
			booleanQuery.add(query1, Occur.MUST);
			booleanQuery.add(query2, Occur.SHOULD);
			System.out.println(booleanQuery);
			printResult(indexSearcher, booleanQuery);
			//关闭资源
			indexSearcher.getIndexReader().close();
		}

4、条件解释的对象查询

@Test
		public void testQueryParser() throws Exception {
			IndexSearcher indexSearcher = getIndexSearcher();
			//参数1: 默认查询的域  
			//参数2:采用的分析器
			QueryParser queryParser = new QueryParser("filename",new IKAnalyzer());
			// *:*   域:值
			org.apache.lucene.search.Query query = queryParser.parse("filename:lucene is apache OR content:lucene is apache");
			
			printResult(indexSearcher, query);
			//关闭资源
			indexSearcher.getIndexReader().close();
		}

5、条件解释的对象查询(多个默认域)

    @Test
	public void testMultiFieldQueryParser() throws Exception {
		IndexSearcher indexSearcher = getIndexSearcher();
		
		String[] fields = {"fileName","fileContent"};
		//参数1: 默认查询的域  
		//参数2:采用的分析器
		MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields,new IKAnalyzer());
		// *:*   域:值
		Query query = queryParser.parse("lucene is apache");
		
		printResult(indexSearcher, query);
		//关闭资源
		indexSearcher.getIndexReader().close();
	}

猜你喜欢

转载自blog.csdn.net/pbrlovejava/article/details/81333779