本文主要是介绍2010-01-04 传智播客—luncene (转载),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
如果大家对文章内容有不理解的地方,尽情留言或QQ(1357208561) 讨论。让大家共同进步。
————tiger20010
我们这些网民,见得多了检索应用了。Google、百度、论坛内部搜索、网站内部搜索…,这些应用使用的就是检索技术。今天我们学习的主要是针对WEB应用的内部文本检索,比如论坛。我们使用的框架是lucene。授课老师是汤阳光,年轻有为!
搞技术的,看到什么新技术总是十分好奇。先不说google和baidu吧(他们的专业检索技术很强哦),见到论坛内部的检索功能,就让我十分好奇。我原本以为论坛内部的检索就是模糊查找数据库,但今日的课程让我学习到了论坛内部真正的检索技术。
一、信息检索和全文检索
信息检索就是从信息集合中找出与用户需求相关的信息。被检索的信息除了文本外,还有图像、音频、视频等多媒体信息。我们只关注文本的检索,把用户的查询请求和全文中的每一个词进行比较,不考虑查询请求与文本语义上的匹配,这叫做全文检索。在信息检索工具中,全文检索是最具通用性和实用性的。例如,使用百度从一大堆网页中搜出与“传智播客”相关的网页。
我们简单看一下检索技术的流程:
请求
上面可见索引数据库是十分重要的,简单的说。全文检索系统,将网络上的数据通过某种格式保存到索引库中。当用户发送查询请求时,实质上就是向索引库查询。全文检索引擎负责处理用户的请求用索引库的更新等。
小时候查的汉语字典、英语词典…我们是如何查询的?当然不是一页一页的翻了,靠的是字典的目录。Lucene的检索方式正是使用了此技术,lucene的索引库格式:
|
上面的表只是简单说明lucene索引库的存储格式。我们通过lucene提供的类可以向索引库添加、修改、查询、删除操作…。
关键字是通过分词器分析出来的,一般情况下各有语言有各字的分词器。分词器的强大提高了查询数据的接近性。
二、lucene操作
我们编写一个对Article对象向lucene索引库的添加、修改、查询、删除操作:
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.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.TopDocs; import cn.itcast.cc.lucene.helloword.Article; import cn.itcast.cc.lucene.helloword.utils.ArticleDocUtils;
public class IndexDao { // 索引目录 private String indexPath = "./index"; // 分词器 private Analyzer analyzer = new StandardAnalyzer();
/** * 保存记录 * * @param art */ public void save(Article art) { // lucene的写出索引类 IndexWriter indexWriter = null; try { indexWriter = new IndexWriter(this.indexPath, this.analyzer, MaxFieldLength.LIMITED); // 添加到索引库 indexWriter.addDocument(ArticleDocUtils.Article2Doc(art)); } catch (Exception e) { e.printStackTrace(); } // 释放indexWriter if (indexWriter != null) { try { // 使用后一定要关闭 indexWriter.close(); } catch (Exception e) { e.printStackTrace(); } } }
/** * 更新记录 * * @param art */ public void update(Article art) { IndexWriter indexWriter = null; try { indexWriter = new IndexWriter(this.indexPath, this.analyzer, MaxFieldLength.LIMITED); Term term = new Term("id", art.getId() + ""); // 更新 indexWriter.updateDocument(term, ArticleDocUtils.Article2Doc(art)); } catch (Exception e) { e.printStackTrace(); }
// 释放indexWriter if (indexWriter != null) { try { indexWriter.close(); } catch (Exception e) { e.printStackTrace(); } } }
/** * 删除记录 * * @param id */ public void delete(int id) { IndexWriter indexWriter = null; try { indexWriter = new IndexWriter(this.indexPath, this.analyzer, MaxFieldLength.LIMITED); Term term = new Term("id", id + ""); // 删除 indexWriter.deleteDocuments(term); } catch (Exception e1) { e1.printStackTrace(); }
// 释放indexWriter if (indexWriter != null) { try { indexWriter.close(); } catch (Exception e) { e.printStackTrace(); } } }
/** * 查询记录(具有分页功 |
这篇关于2010-01-04 传智播客—luncene (转载)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!