Lucene-索引库的CRUD

4.1保持数据库与索引库的同步


说明:在一个系统中,如果索引功能存在,那么数据库和索引库应该是同时存在的。这个时候需要保证索引库的数据和数据库中的数据保持一致性。可以在对数据库进行增、删、改操作的同时对索引库也进行相应的操作。这样就可以保证数据库与索引库的一致性。


工具类DocumentUtils

public class DocumentUtils {
	public static Document article2Document(Article article){
		Document document = new Document();
		Field idField = new Field("id",article.getId().toString(),Store.YES,Index.NOT_ANALYZED);
		Field titleField = new Field("title",article.getTitle(),Store.YES,Index.ANALYZED);
		Field contentField = new Field("content",article.getContent(),Store.YES,Index.ANALYZED);
		document.add(idField);
		document.add(titleField);
		document.add(contentField);
		return document;
	}
	
	public static Article document2Article(Document document){
		Article article = new Article();
		article.setId(Long.parseLong(document.get("id")));
		article.setTitle(document.get("title"));
		article.setContent(document.get("content"));
		return article;
	}
}


public class LuceneUtils {
	public static Directory directory;
	public static Analyzer analyzer;
	static{
		try{
			directory = FSDirectory.open(new File("./indexDir"));
			analyzer = new StandardAnalyzer(Version.LUCENE_30);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

public class ArticleIndex {
	@Test
	public void testCreateIndex() throws Exception{
		Article article = new  Article();
		article.setId(1L);
		article.setTitle("lucene可以做搜索引擎");
		article.setContent("baidu,google都是很好的搜索引擎");
		
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
		indexWriter.addDocument(DocumentUtils.article2Document(article));
		indexWriter.close();
	}
	
	@Test
	public void testSearchIndex() throws Exception{
		IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.directory);
		QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, new String[]{"title","content"}, LuceneUtils.analyzer);
		Query query = queryParser.parse("baidu");
		TopDocs topDocs = indexSearcher.search(query, 2);
		ScoreDoc[] scoreDocs = topDocs.scoreDocs;
		List<Article> articleList = new ArrayList<Article>();
		for(ScoreDoc scoreDoc:scoreDocs){
			Document document =  indexSearcher.doc(scoreDoc.doc);
			Article article = DocumentUtils.document2Article(document);
			articleList.add(article);
		}
		
		for(Article article:articleList){
			System.out.println(article.getId());
			System.out.println(article.getTitle());
			System.out.println(article.getContent());
		}
	}
	
	/**
	 * 一般情况下索引库的删除用关键词
	 * @throws Exception
	 */
	@Test
	public void testDeleteIndex() throws Exception{
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
		//indexWriter.deleteAll()删除所有的索引值
		/**
		 * term就为关键词对象
		 */
		Term term = new Term("title", "lucene");
		indexWriter.deleteDocuments(term);
		indexWriter.close();
	}
	
	/**
	 * 修改
	 *    先删除后增加
	 */
	@Test
	public void testUpdateIndex() throws Exception{
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);
		Term term = new Term("title", "lucene");
		Article article = new  Article();
		article.setId(1L);
		article.setTitle("lucene可以做搜索引擎");
		article.setContent("修改后的内容");
		/**
		 * term是用删除的
		 * document是用于增加的
		 */
		indexWriter.updateDocument(term, DocumentUtils.article2Document(article));
		indexWriter.close();
	}
}

	public void create () throws CorruptIndexException, LockObtainFailedException, IOException{
		Article article = new  Article();
		article.setId(1L);
		article.setTitle("lucene可以做搜索引擎");
		article.setContent("baidu,google都是很好的搜索引擎");
		IndexWriter indexWriter=new IndexWriter(LuceneUtils.directory, LuceneUtils.analyzer, MaxFieldLength.LIMITED);
		indexWriter.addDocument(DocumentUtils.article2Document(article));
		indexWriter.close();
	}

@Test
	public void Query() throws CorruptIndexException, IOException,
			ParseException {
		IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.directory);
		QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30,
				new String[] { "title", "content" }, LuceneUtils.analyzer);

		TopDocs topDocs = indexSearcher.search(queryParser.parse("lucene"), 2);
		ScoreDoc[] scoreDocs = topDocs.scoreDocs;
		List<Article> articleList = new ArrayList<Article>();
		for (ScoreDoc scoreDoc : scoreDocs) {
			System.err.println("相关度为" + scoreDoc.score);
			Document document = indexSearcher.doc(scoreDoc.doc);
			Article article = DocumentUtils.document2Article(document);
			articleList.add(article);
		}
		for (Article article : articleList) {
			System.out.println(article.getId());
			System.out.println(article.getTitle());
			System.out.println(article.getContent());
		}
	}

@Test
	public void delete() throws CorruptIndexException, LockObtainFailedException, IOException{
		IndexWriter indexWriter=new IndexWriter(LuceneUtils.directory, LuceneUtils.analyzer, MaxFieldLength.LIMITED);
		// indexWriter.deleteAll()删除所有的索引值
				/**
				 * term就为关键词对象
				 */
		indexWriter.deleteDocuments(new Term("title","lucene"));
		indexWriter.close();
		
	}

/**
	 * 
	 * 修改 先删除后增加
	 * @throws IOException 
	 * @throws CorruptIndexException 
	 * 
	 */
	@Test
	public void update() throws CorruptIndexException, IOException {
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,
				LuceneUtils.analyzer, MaxFieldLength.LIMITED);
		Term term = new Term("title", "lucene");
		Article article = new Article();
		article.setId(1L);
		article.setTitle("lucene可以做搜索引擎");
		article.setContent("修改后的内容");
		/**
		 * term是用删除的 document是用于增加的
		 */
		indexWriter.updateDocument(term,
				DocumentUtils.article2Document(article));
		indexWriter.close();
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Lucene-Core 是 Apache Lucene 项目的核心依赖。Lucene 是一个开源的全文检索引擎工具包,提供了强大的全文检索功能,可用于构建各种基于文本的应用程序。 在使用 Lucene 时,需要添加 Lucene-Core 依赖到项目中,以便能够使用 Lucene 提供的各种功能。Lucene-Core 是 Lucene 项目最基本的依赖,包含了一些必备的类和方法,用于索引和搜索文档。 通过 Lucene-Core,可以使用 Lucene 提供的各种 API 来创建索引、搜索和加权查询。Lucene 使用倒排索引的方式来快速定位包含搜索词的文档,而不需要遍历整个文档集合。这种索引结构使得 Lucene 具有出色的搜索效率和性能。 Lucene-Core 还提供了各种分析器(Analyzer)和查询解析器(Query Parser),用于处理文本的分词、词干处理和查询解析等操作。分析器可用于将文本分割成词语,并根据需要进行一些文本处理操作。查询解析器则用于将用户的查询语句解析成 Lucene 可以理解的查询对象。 除了 Lucene-Core,还存在其他的 Lucene 依赖,如 Lucene-Analyzers、Lucene-Queries 等,它们提供了更高级的功能和扩展,用于处理多语言分词、模糊查询、范围查询等等。 总之,Java Lucene-Core 依赖是使用 Lucene 的必备,它提供了构建全文检索应用程序所需的基本功能和工具。通过使用 Lucene-Core,开发人员可以更方便地利用 Lucene 的强大功能来实现高效的全文检索。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值