`
john.zhang
  • 浏览: 16111 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

lucene小例子

 
阅读更多

1. 环境 lucene 2.4

    a. 实体 Article.java

public class Article {
	private Long id;
	private String title;
	private String content;

	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
}

 

  b. 将 实体和 document 转换的类

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumberTools;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;

// logForj
public class ArticleDocumentUtils {

	/**
	 * Article --> Document 
	 * @param article
	 * @return
	 */
	public static Document article2Document(Article article) {
		Document doc = new Document();

		// article.properties --> doc.fieldList
		doc.add(new Field("id", NumberTools.longToString(article.getId()), Store.YES, Index.NOT_ANALYZED));
		
		Field field = new Field("title", article.getTitle(), Store.YES, Index.ANALYZED);
		field.setBoost(2.0F); // 默认为1.0F
		doc.add(field);
		
		doc.add(new Field("content", article.getContent(), Store.YES, Index.ANALYZED));

		return doc;
	}

	/**
	 * Document --> Article
	 * 
	 * @param doc
	 * @return
	 */
	public static Article document2Article(Document doc) {
		Article article = new Article();

		Long id =NumberTools.stringToLong(doc.getField("id").stringValue());
		String title = doc.getField("title").stringValue();
		String content = doc.getField("content").stringValue();

		article.setId(id);
		article.setTitle(title);
		article.setContent(content);

		return article;
	}
}

 

// 时间类弄的转换
doc.add(new Field("postTime", DateTools.dateToString(article.getPostTime(), Resolution.SECOND), Store.YES, Index.NO));
article.setPostTime(DateTools.stringToDate(doc.get("postTime")));

 

 

   c. 测试方法 HelloWorld.java

import java.util.ArrayList;
import java.util.List;

import jeasy.analysis.MMAnalyzer;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.junit.Test;

// Lucene 2.4
public class HelloWorld {

	// 索引目录
	private String indexPath = "./index/";
	// 分词器
	// private Analyzer analyzer = new StandardAnalyzer();
	private Analyzer analyzer = new MMAnalyzer();

	// 建立索引
	@Test
	public void createIndex() throws Exception {
		// 模拟一个已经存在的文章
		Article article = new Article();
		article.setId(1L);
		article.setTitle("小笑话 -- 牛人发帖"); // 笑话
		article
				.setContent("有一牛人发一帖,然后马上就用发帖id疯狂回复自己的帖子:自己回帖1:楼主太有才了自己回帖2:楼主说的不错,挺有道理的自己回帖3:楼主真是太牛了,好崇拜你.最后终于有人回复他的帖子: 我靠,好歹你也换个id啊");

		// article --> Document
		Document doc = ArticleDocumentUtils.article2Document(article);

		// 建立索引(放到索引库中)
		IndexWriter indexWriter = new IndexWriter(indexPath, analyzer,
				MaxFieldLength.LIMITED);
		indexWriter.addDocument(doc);
		indexWriter.close();
	}

	// 搜索
	@Test
	public void search() throws Exception {
		// String queryString = "笑话";
		String queryString = "幽默";

		// =============================================
		// 1,queryString --> query
		// hql --> Hibernate.Query
		String[] fields = new String[] { "title", "content" };
		QueryParser queryParser = new MultiFieldQueryParser(fields, analyzer);
		Query query = queryParser.parse(queryString);

		// 2,搜索-->搜索结果 // 在所有文章的"标题"和"内容"中搜索
		IndexSearcher indexSearcher = new IndexSearcher(indexPath); // 在指定的索引库中搜索
		TopDocs topDocs = indexSearcher.search(query, null, 100);// TopDocs是包装了查询结果的对象

		// 3,处理搜索结果
		// topDocs.totalHits; 数字类型,代表匹配的结果的数量
		// topDocs.scoreDocs; ScoreDoc数组,代表匹配的所有结果(ScoreDoc只有Document的内部编号)
		System.out.println("匹配的结果的数量:" + topDocs.totalHits);
		List<Article> list = new ArrayList<Article>();
		for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
			int docSn = scoreDoc.doc; // 文档对应的内部编码
			Document doc = indexSearcher.doc(docSn); // 根据内部编号取出Document
			list.add(ArticleDocumentUtils.document2Article(doc));
		}
		indexSearcher.close();
		// =============================================

		// 打印结果
		for (Article a : list) {
			System.out.println("---------------------------> " + a.getId());
			System.out.println("Id	= " + a.getId());
			System.out.println("Title	= " + a.getTitle());
			System.out.println("Content	= " + a.getContent());
		}
	}
}

 

 

高亮器测试

import java.util.ArrayList;
import java.util.List;

import jeasy.analysis.MMAnalyzer;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.Scorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.junit.Test;

import cn.itcast.lucene.helloworld.Article;
import cn.itcast.lucene.helloworld.ArticleDocumentUtils;

public class HighLighterTest {

	// 索引目录
	private String indexPath = "./index/";
	// 分词器
	private Analyzer analyzer = new MMAnalyzer();// new StandardAnalyzer();

	@Test
	public void test() throws Exception {
		String queryString = "回帖";
		// String queryString = "幽默";

		// =============================================
		// 1,queryString --> query
		QueryParser queryParser = new MultiFieldQueryParser(new String[] { "title", "content" }, analyzer);
		Query query = queryParser.parse(queryString);

		// 2,搜索-->搜索结果 // 在所有文章的"标题"和"内容"中搜索
		IndexSearcher indexSearcher = new IndexSearcher(indexPath); // 在指定的索引库中搜索
		TopDocs topDocs = indexSearcher.search(query, null, 100);// TopDocs是包装了查询结果的对象

		// ===================== 初始化高亮器
		Formatter formatter = new SimpleHTMLFormatter("<span class='keyword'>", "</span>");// 默认为<b>和</b>
		Scorer scorer = new QueryScorer(query);
		Highlighter highlighter = new Highlighter(formatter, scorer);

		Fragmenter fragmenter = new SimpleFragmenter(50); // 默认为100
		highlighter.setTextFragmenter(fragmenter);
		// =====================

		// 3,处理搜索结果
		// topDocs.totalHits; 数字类型,代表匹配的结果的数量
		// topDocs.scoreDocs; ScoreDoc数组,代表匹配的所有结果(ScoreDoc只有Document的内部编号)
		System.out.println("匹配的结果的数量:" + topDocs.totalHits);
		List<Article> list = new ArrayList<Article>();
		for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
			int docSn = scoreDoc.doc; // 文档对应的内部编码
			// scoreDoc.score;
			Document doc = indexSearcher.doc(docSn); // 根据内部编号取出Document

			// =================== 使用高亮器
			// doc.getField("content").stringValue() --> doc.get("content")
			// 高亮操作不影响原始数据
			// 如果高亮的属性值中没有出现关键词,就返回null
			String ht = highlighter.getBestFragment(analyzer, "content", doc.get("content"));
			if (ht != null) {
				doc.getField("content").setValue(ht);
			}
			// ===================

			list.add(ArticleDocumentUtils.document2Article(doc));
		}
		indexSearcher.close();
		// =============================================

		// 打印结果
		for (Article a : list) {
			System.out.println("---------------------------> " + a.getId());
			System.out.println("Id	= " + a.getId());
			System.out.println("Title	= " + a.getTitle());
			System.out.println("Content	= " + a.getContent());
		}
	}
}

 

 

CRUD 操作

import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;

import cn.itcast.lucene.helloworld.Article;
import cn.itcast.lucene.helloworld.ArticleDocumentUtils;

public class IndexDao {

	// 索引目录
	private String indexPath = "./index/";
	// 分词器
	private Analyzer analyzer = new StandardAnalyzer();

	/**
	 * 建立索引(保存到索引库)
	 * 
	 * @param article
	 */
	public void save(Article article) {
		// 1, article --> Document
		Document doc = ArticleDocumentUtils.article2Document(article);

		// 2, indexWriter.add( doc )
		IndexWriter indexWriter = null;
		try {
			indexWriter = new IndexWriter(indexPath, analyzer, MaxFieldLength.LIMITED);
			indexWriter.addDocument(doc);
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (indexWriter != null) {
				try {
					indexWriter.close();
				} catch (Exception e) {
					throw new RuntimeException(e);
				}
			}
		}
	}

	/**
	 * 删除索引
	 * 
	 * @param id
	 * 
	 * delete from table_article WHERE ?(term.name)=?(term.value)
	 */
	public void delete(Long id) {
		IndexWriter indexWriter = null;
		try {
			indexWriter = new IndexWriter(indexPath, analyzer, MaxFieldLength.LIMITED);

			Term term = new Term("id", id.toString());
			// 含有term的所有Document都将被删掉
			indexWriter.deleteDocuments(term);
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (indexWriter != null) {
				try {
					indexWriter.close();
				} catch (Exception e) {
					throw new RuntimeException(e);
				}
			}
		}
	}

	/**
	 * 更新索引
	 * 
	 * @param article
	 * 
	 * update table_article set xxx=xxx,yy=yyy... WHERE id=?( article.getId() )
	 */
	public void update(Article article) {
		IndexWriter indexWriter = null;
		try {
			Term term = new Term("id", article.getId().toString());
			Document doc = ArticleDocumentUtils.article2Document(article);

			indexWriter = new IndexWriter(indexPath, analyzer, MaxFieldLength.LIMITED);
			// 更新含有term的Document,更新后的状态在doc中
			indexWriter.updateDocument(term, doc);

			// 更新就是“先删除,再创建”
			// indexWriter.deleteDocuments(term);
			// indexWriter.addDocument(doc);
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (indexWriter != null) {
				try {
					indexWriter.close();
				} catch (Exception e) {
					throw new RuntimeException(e);
				}
			}
		}
	}

	/**
	 * 搜索,分页(符合某条件的某一页的数据)
	 * 
	 * @param queryString
	 * @param firstResult
	 * @param maxResults
	 * @return
	 * 
	 * select * from table_article limit ?:first,?:max
	 * 
	 * select count(*) from table_article
	 */
	public SearchResult search(String queryString, int firstResult, int maxResults) {
		// 1, queryString --> Query
		IndexSearcher indexSearcher = null;
		try {
			QueryParser queryParser = new MultiFieldQueryParser(new String[] { "title", "content" }, analyzer);
			Query query = queryParser.parse(queryString);

			// 2, 进行搜索, 在title与content中搜索 --> TopDocs( totalHits, scoreDocs )
			indexSearcher = new IndexSearcher(indexPath);
			TopDocs topDocs = indexSearcher.search(query, null, 100);

			// 3, 处理结果,返回
			List<Article> list = new ArrayList<Article>();
			int end = Math.min(firstResult + maxResults, topDocs.scoreDocs.length);

			for (int i = firstResult; i < end; i++) {
				ScoreDoc scoreDoc = topDocs.scoreDocs[i];
				int docSn = scoreDoc.doc; // Document的内部编号
				Document doc = indexSearcher.doc(docSn); // 根据Document的内部编号取出相应的Document

				Article article = ArticleDocumentUtils.document2Article(doc);
				list.add(article);
			}

			return new SearchResult(topDocs.totalHits, list);
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (indexSearcher != null) {
				try {
					indexSearcher.close(); // 取完数据在关闭
				} catch (Exception e) {
					throw new RuntimeException(e);
				}
			}
		}

	}

}

 

分享到:
评论

相关推荐

    lucene例子(一个完整的,lucene例子)(lucenetest.rar,lucene,全文检索,lucene例子)

    lucenetest.rar,lucene,全文检索,lucene例子 lucenetest.rar,lucene,全文检索,lucene例子lucenetest.rar,lucene,全文检索,lucene例子

    lucene入门小例子

    这个“lucene入门小例子”很可能是为了帮助初学者理解并掌握Lucene的基本用法而设计的一系列示例代码。 Lucene的核心概念包括索引、文档、字段和查询。首先,你需要理解索引的概念,它类似于传统数据库中的索引,但...

    lucene与quartz例子

    lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子

    lucene检索小例子

    **Lucene检索小例子** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。这个"lucene检索小例子"程序展示了如何利用Lucene的强大功能来构建索引和执行搜索操作。Lucene的核心特性包括文本分析、...

    lucene3.0 例子

    lucene3.0 例子lucene3.0 例子 lucene3.0 例子 ,很好的学习,只有原代原,jar 包自己加上去就OK了

    lucene文档例子

    lucene文档例子

    lucene3 例子

    6. **优化与性能**:可能涉及到索引的优化策略,如合并小段,以及如何调整缓存大小、使用多线程等提升搜索性能。 7. **实用工具类**:可能介绍了Directory、IndexReader、IndexWriter等关键类的使用方法,以及如何...

    一个基于LUCENE搜索引擎项目例子

    在这个项目例子中,我们将深入探讨如何利用Lucene进行索引构建、查询处理以及结果排序,从而创建一个功能完善的搜索引擎。 首先,我们需要了解Lucene的基本概念。Lucene的核心功能包括文本分析、索引构建和搜索。...

    lucene3小例子

    《Lucene3小例子》 Lucene是一款强大的全文搜索引擎库,由Apache软件基金会开发,它提供了高效的文本检索、分析和管理功能。在这个“lucene3小例子”中,我们将探讨如何利用Lucene 3.x版本进行基本的全文搜索操作。...

    Heritrix+Lucene搜索例子

    这个“Heritrix+Lucene搜索例子”可能涉及到如何将Heritrix抓取的数据整合到Lucene的搜索框架中,从而实现对网络抓取内容的有效检索。 首先,Heritrix的工作流程包括配置爬虫策略、启动爬虫、抓取网页、存储和归档...

    SQLServer+Lucene.Net例子

    本文将深入探讨如何结合SQL Server数据库与Lucene.NET,实现高效、灵活的全文搜索功能。Lucene.NET是一个强大的、开源的全文检索库,它为.NET开发者提供了构建高效搜索引擎的工具。 首先,让我们了解SQL Server。...

    Lucene学习例子与文档

    **Lucene学习例子与文档详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了完整的搜索功能,包括索引、查询、排序等。Lucene被广泛应用于各种需要全文检索的项目中,如网站、文档管理、...

    lucene开发部分例子

    这个压缩包文件“lucene开发部分例子”包含了关于Lucene开发的一些实例,涵盖了从基础到进阶的多个方面,对于学习和理解Lucene的使用非常有帮助。 首先,"Web搜索引擎开发实例"这部分内容将教你如何使用Lucene来...

    LUCENE的搜索引擎例子

    在IT行业中,Lucene是一个非常重要的开源全文搜索引擎库,由Apache软件基金会开发并维护。本篇文章将深入探讨如何在B/S(浏览器/服务器)架构下利用Lucene实现一个简单的搜索引擎实例。 首先,我们需要了解Lucene的...

    lucene7例子

    《深入理解Lucene 7:一个实用的例子》 在信息技术领域,搜索引擎的构建与优化是一项至关重要的任务。Apache Lucene,作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将围绕“Lucene 7例子”这一...

    lucene3.6 搜索例子

    《Lucene 3.6 搜索实例解析》 Apache Lucene 是一个开源全文搜索引擎库,为开发者提供了在Java应用程序中实现高效、可扩展的搜索功能的工具。在本篇文章中,我们将深入探讨Lucene 3.6版本中的搜索功能,通过实例...

    lucene_demo例子

    《Lucene实战(第2版) PDF高清中文版.pdf》这本书是关于Apache Lucene的一本经典教程,适合初学者入门。Lucene是一个全文搜索引擎库,它提供了强大的文本搜索功能,被广泛应用于各种信息检索系统中。这本书详细介绍了...

    lucene全文搜索ajax例子

    总的来说,这个例子是一个综合性的Web应用,它展示了如何利用Lucene进行全文搜索,结合Ajax技术实现动态更新的搜索结果展示,同时还包括了高亮显示和多次搜索的功能。这对于学习和理解Lucene在实际应用中的工作原理...

    lucene简单例子

    标题"lucene简单例子"指出我们将探讨如何使用Apache Lucene这个开源全文搜索引擎库进行数据存储和搜索。Lucene是Java开发的一个高性能、可扩展的信息检索库,它提供了强大的文本分析和索引功能,使得开发者能够轻松...

Global site tag (gtag.js) - Google Analytics