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); } } } } }
相关推荐
lucenetest.rar,lucene,全文检索,lucene例子 lucenetest.rar,lucene,全文检索,lucene例子lucenetest.rar,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检索小例子** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。这个"lucene检索小例子"程序展示了如何利用Lucene的强大功能来构建索引和执行搜索操作。Lucene的核心特性包括文本分析、...
lucene3.0 例子lucene3.0 例子 lucene3.0 例子 ,很好的学习,只有原代原,jar 包自己加上去就OK了
lucene文档例子
6. **优化与性能**:可能涉及到索引的优化策略,如合并小段,以及如何调整缓存大小、使用多线程等提升搜索性能。 7. **实用工具类**:可能介绍了Directory、IndexReader、IndexWriter等关键类的使用方法,以及如何...
在这个项目例子中,我们将深入探讨如何利用Lucene进行索引构建、查询处理以及结果排序,从而创建一个功能完善的搜索引擎。 首先,我们需要了解Lucene的基本概念。Lucene的核心功能包括文本分析、索引构建和搜索。...
《Lucene3小例子》 Lucene是一款强大的全文搜索引擎库,由Apache软件基金会开发,它提供了高效的文本检索、分析和管理功能。在这个“lucene3小例子”中,我们将探讨如何利用Lucene 3.x版本进行基本的全文搜索操作。...
这个“Heritrix+Lucene搜索例子”可能涉及到如何将Heritrix抓取的数据整合到Lucene的搜索框架中,从而实现对网络抓取内容的有效检索。 首先,Heritrix的工作流程包括配置爬虫策略、启动爬虫、抓取网页、存储和归档...
本文将深入探讨如何结合SQL Server数据库与Lucene.NET,实现高效、灵活的全文搜索功能。Lucene.NET是一个强大的、开源的全文检索库,它为.NET开发者提供了构建高效搜索引擎的工具。 首先,让我们了解SQL Server。...
**Lucene学习例子与文档详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了完整的搜索功能,包括索引、查询、排序等。Lucene被广泛应用于各种需要全文检索的项目中,如网站、文档管理、...
这个压缩包文件“lucene开发部分例子”包含了关于Lucene开发的一些实例,涵盖了从基础到进阶的多个方面,对于学习和理解Lucene的使用非常有帮助。 首先,"Web搜索引擎开发实例"这部分内容将教你如何使用Lucene来...
在IT行业中,Lucene是一个非常重要的开源全文搜索引擎库,由Apache软件基金会开发并维护。本篇文章将深入探讨如何在B/S(浏览器/服务器)架构下利用Lucene实现一个简单的搜索引擎实例。 首先,我们需要了解Lucene的...
《深入理解Lucene 7:一个实用的例子》 在信息技术领域,搜索引擎的构建与优化是一项至关重要的任务。Apache Lucene,作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将围绕“Lucene 7例子”这一...
《Lucene 3.6 搜索实例解析》 Apache Lucene 是一个开源全文搜索引擎库,为开发者提供了在Java应用程序中实现高效、可扩展的搜索功能的工具。在本篇文章中,我们将深入探讨Lucene 3.6版本中的搜索功能,通过实例...
《Lucene实战(第2版) PDF高清中文版.pdf》这本书是关于Apache Lucene的一本经典教程,适合初学者入门。Lucene是一个全文搜索引擎库,它提供了强大的文本搜索功能,被广泛应用于各种信息检索系统中。这本书详细介绍了...
总的来说,这个例子是一个综合性的Web应用,它展示了如何利用Lucene进行全文搜索,结合Ajax技术实现动态更新的搜索结果展示,同时还包括了高亮显示和多次搜索的功能。这对于学习和理解Lucene在实际应用中的工作原理...
标题"lucene简单例子"指出我们将探讨如何使用Apache Lucene这个开源全文搜索引擎库进行数据存储和搜索。Lucene是Java开发的一个高性能、可扩展的信息检索库,它提供了强大的文本分析和索引功能,使得开发者能够轻松...