Lucene之索引库CRUD

本文详细介绍如何使用Lucene进行文档的索引、查询、修改及删除操作,包括创建索引库、执行不同类型的查询、更新及删除索引条目。

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

一、增加索引库

    //创建索引
    @Test
    public void testCreateIndex() throws Exception{
 
        //指定索引库的存放位置Directory对象
        Directory directory = FSDirectory.open(new File("D:\\长期数据\\index"));
        //指定一个分析器,对文档内容进行分析
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3,new StandardAnalyzer());
 
        //第一步:创建IndexWriter对象
        IndexWriter indexWriter = new IndexWriter(directory,config);
 
        //第三步:创建Field对象,将Field添加到Document对象中
        File file = new File("D:\\长期数据\\searchsource");
        File[] files = file.listFiles();
        for(File oneFile : files){
            //第二步:创建Document对象
            Document document = new Document();
 
            //文件名称
            String fileName = oneFile.getName();
            //三个参数(域名,域值,是否存储)
            TextField fileNameField = new TextField("fileName", fileName, Field.Store.YES);
 
            //文件路径
            String filePath = oneFile.getPath();
            StoredField filePathField = new StoredField("filePath", filePath);
 
            //文件大小
            Long fileSize = FileUtils.sizeOf(oneFile);
            LongField fileSizeField = new LongField("fileSize", fileSize, Field.Store.YES);
 
            //文件内容
            String fileContent = FileUtils.readFileToString(oneFile);
            TextField fileContentField = new TextField("fileContent", fileContent, Field.Store.YES);
 
            document.add(fileNameField);
            document.add(filePathField);
            document.add(fileSizeField);
            document.add(fileContentField);
            //第四步:使用IndexWriter对象将Document对象写入索引库,此过程进行索引创建,并将索引和Document对象写入索引库
            indexWriter.addDocument(document);
        }
 
        //第五步:关闭IndexWriter对象
        indexWriter.close();
 
    }


方法抽取,方便以下操作 

	//IndexReader  IndexSearcher
	public IndexSearcher getIndexSearcher() throws Exception{
		// 第一步:创建一个Directory对象,也就是索引库存放的位置。
		Directory directory = FSDirectory.open(new File("D:\\长期数据\\index"));// 磁盘
		// 第二步:创建一个indexReader对象,需要指定Directory对象。
		IndexReader indexReader = DirectoryReader.open(directory);
		// 第三步:创建一个indexsearcher对象,需要指定IndexReader对象
		return new IndexSearcher(indexReader);
	}

    //执行查询的结果
	public void printResult(IndexSearcher indexSearcher,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("------------");
		}
	}

二、删除索引库

    //删除全部索引
	@Test
	public void deleteAllIndex() throws Exception {
		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可以有不同的域,同一个document可以有相同的域。
		document.add(new TextField("filename", "要更新的文档", Store.YES));
		document.add(new TextField("content", "2013年11月18日 - Lucene 简介Lucene"+
                "是一个基于Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,"+
                "而是为你的应用程序提供索引和搜索功能。", Store.YES));
		indexWriter.updateDocument(new Term("content", "java"), document);
		//关闭indexWriter
		indexWriter.close();
	}

四、查询索引库

1.query的子类查询

(1)MatchAllDocsQuery匹配所有文档

    @Test
	public void testMatchAllDocsQuery() throws Exception {
		IndexSearcher indexSearcher = getIndexSearcher();
		//创建查询条件
		Query query = new MatchAllDocsQuery();
		//执行查询
		printResult(query, indexSearcher);
	}

(2)TermQuery

    //使用Termquery查询
	@Test
	public void testTermQuery() throws Exception {
		IndexSearcher indexSearcher = getIndexSearcher();
		//创建查询对象
		Query query = new TermQuery(new Term("content", "lucene"));
		//执行查询
		printResult(query, indexSearcher);
	}

(3)NumericRangeQuery根据数值范围查询

	//根据数值范围查询
	@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();
	}

(4)BooleanQuery组合条件查询

	//可以组合查询条件
	@Test
	public void testBooleanQuery() throws Exception {
		IndexSearcher indexSearcher = getIndexSearcher();
		
		BooleanQuery booleanQuery = new BooleanQuery();
		
		Query query1 = new TermQuery(new Term("fileName","apache"));
		Query 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();
	}

2.queryParser查询 

(1)查询语法

关键词查询

域名+“:”+搜索的关键字

例如:content:java

范围查询

域名+“:”+[最小值 TO 最大值]

例如:size:[1 TO 1000]

范围查询在lucene中支持数值类型,不支持字符串类型。在solr中支持字符串类型。

组合条件查询

1)+条件1 +条件2:两个条件之间是并且的关系and

例如:+filename:apache +content:apache

2)+条件1 条件2:必须满足第一个条件,应该满足第二个条件

例如:+filename:apache content:apache

3)条件1 条件2:两个条件满足其一即可。

例如:filename:apache content:apache

4)-条件1 条件2:必须不满足条件1,要满足条件2

例如:-filename:apache content:apache

Occur.MUST 查询条件必须满足,相当于and

+(加号)

Occur.SHOULD 查询条件可选,相当于or

 

空(不用符号)

Occur.MUST_NOT 查询条件不能满足,相当于not非

-(减号)

第二种写法:

条件1 AND 条件2

条件1 OR 条件2

条件1 NOT 条件2

(2)QueryParser

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

(3)MultiFieldQueryParser

    //条件解析的对象查询,默认多个域 
	@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();
	}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值