全文检索lucene6.1的检索方式
背景:
一:按被搜索的资源类型
1、可以转为文本的
2、多媒体类型的
二:按照搜索方式:
1、不处理语义,只是找出现了指定词语的所有文本。(指对词语进行匹配)
基本概念:
1、使用流程:先建立索引,(索引库)在进行搜索。
2、使用Lucene的数据结构,document、field。
建立索引的过程:
1、定义一个语法分词器
2、确定索引存储的位置
3、创建IndexWriter,进行索引的写入
4、内容提取,进行索引文件的写入
5、关闭indexWriter
从索引库中搜索的过程:
1、打开存储位置
2、创建搜索器
3、类似SQL进行查询
4、处理结果
5、关闭DirectoryReader
- /**
- * @项目名称:lucene
- * @类名称:Article
- * @类描述:这是一个文章实体类
- * @创建人:YangChao
- * @创建时间:2016年8月30日 下午3:11:38
- * @version 1.0.0
- */
- public class Article {
- private Integer id;
- private String title;
- private String content;
- }
- /**
- * @项目名称:lucene
- * @类名称:DocumentUtils
- * @类描述:文章实体类和Document的转换工具
- * @创建人:YangChao
- * @创建时间:2016年8月31日 上午10:15:22
- * @version 1.0.0
- */
- public class DocumentUtils {
- public static Document article2Document(Article article) {
- Document doc = new Document();
- doc.add(new Field("id", article.getId().toString(), TextField.TYPE_STORED));
- doc.add(new Field("title", article.getTitle(), TextField.TYPE_STORED));
- doc.add(new Field("content", article.getContent(), TextField.TYPE_STORED));
- return doc;
- }
- public static Article document2Ariticle(Document doc) {
- Article article = new Article();
- article.setId(Integer.parseInt(doc.get("id")));
- article.setTitle(doc.get("title"));
- article.setContent(doc.get("content"));
- return article;
- }
- }
- /**
- * @项目名称:lucene
- * @类名称:LuceneUtils
- * @类描述:获取分词器和索引位置
- * @创建人:YangChao
- * @创建时间:2016年8月31日 上午9:48:06
- * @version 1.0.0
- */
- public class LuceneUtils {
- private static Logger logger = Logger.getLogger(LuceneUtils.class);
- private static Directory directory;
- private static Analyzer analyzer;
- static {
- try {
- directory = FSDirectory.open(Paths.get("./tmp/testindex"));
- // analyzer = new StandardAnalyzer();
- analyzer = new SmartChineseAnalyzer();
- } catch (Exception e) {
- logger.error("LuceneUtils error!", e);
- }
- }
- public static Directory getDirectory() {
- return directory;
- }
- public static Analyzer getAnalyzer() {
- return analyzer;
- }
- public static void closeIndexWriter(IndexWriter indexWriter) {
- if (indexWriter != null) {
- try {
- indexWriter.close();
- } catch (Exception e2) {
- logger.error("indexWriter.close error", e2);
- }
- }
- }
- }
- **
- * @项目名称:lucene
- * @类名称:QueryResult
- * @类描述:结果集
- * @创建人:YangChao
- * @创建时间:2016年8月31日 下午4:56:24
- * @version 1.0.0
- */
- public class QueryResult {
- private int count;
- private List list;
- public QueryResult() {
- super();
- }
- public QueryResult(int count, List list) {
- super();
- this.count = count;
- this.list = list;
- }
- }
- /**
- * @项目名称:lucene
- * @类名称:IndexDao
- * @类描述:
- * @创建人:YangChao
- * @创建时间:2016年8月31日 上午10:12:05
- * @version 1.0.0
- */
- public class IndexDao {
- private static Logger logger = Logger.getLogger(IndexDao.class);
- public void save(Article article) {
- Document doc = DocumentUtils.article2Document(article);
- IndexWriter indexWriter = null;
- try {
- IndexWriterConfig config = new IndexWriterConfig(LuceneUtils.getAnalyzer());
- indexWriter = new IndexWriter(LuceneUtils.getDirectory(), config);
- indexWriter.addDocument(doc);
- } catch (Exception e) {
- logger.error("IndexDao.save error", e);
- } finally {
- LuceneUtils.closeIndexWriter(indexWriter);
- }
- }
- public void delete(String id) {
- IndexWriter indexWriter = null;
- try {
- Term term = new Term("id", id);
- IndexWriterConfig config = new IndexWriterConfig(LuceneUtils.getAnalyzer());
- indexWriter = new IndexWriter(LuceneUtils.getDirectory(), config);
- indexWriter.deleteDocuments(term);// 删除含有指定term的所有文档
- } catch (Exception e) {
- logger.error("IndexDao.save error", e);
- } finally {
- LuceneUtils.closeIndexWriter(indexWriter);
- }
- }
- public void update(Article article) {
- Document doc = DocumentUtils.article2Document(article);
- IndexWriter indexWriter = null;
- try {
- Term term = new Term("id", article.getId().toString());
- IndexWriterConfig config = new IndexWriterConfig(LuceneUtils.getAnalyzer());
- indexWriter = new IndexWriter(LuceneUtils.getDirectory(), config);
- indexWriter.updateDocument(term, doc);// 先删除,后创建。
- } catch (Exception e) {
- logger.error("IndexDao.save error", e);
- } finally {
- LuceneUtils.closeIndexWriter(indexWriter);
- }
- }
- public QueryResult search(String queryString, int firstResult, int maxResult) {
- List<Article> list = new ArrayList<Article>();
- try {
- DirectoryReader ireader = DirectoryReader.open(LuceneUtils.getDirectory());
- // 2、第二步,创建搜索器
- IndexSearcher isearcher = new IndexSearcher(ireader);
- // 3、第三步,类似SQL,进行关键字查询
- String[] fields = { "title", "content" };
- QueryParser parser = new MultiFieldQueryParser(fields, LuceneUtils.getAnalyzer());
- Query query = parser.parse("检索");
- TopDocs topDocs = isearcher.search(query, firstResult + maxResult);
- int count = topDocs.totalHits;// 总记录数
- System.out.println("总记录数为:" + topDocs.totalHits);// 总记录数
- ScoreDoc[] hits = topDocs.scoreDocs;// 第二个参数,指定最多返回前n条结果
- // 高亮
- Formatter formatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");
- Scorer source = new QueryScorer(query);
- Highlighter highlighter = new Highlighter(formatter, source);
- // 摘要
- // Fragmenter fragmenter = new SimpleFragmenter(5);
- // highlighter.setTextFragmenter(fragmenter);
- // 处理结果
- int endIndex = Math.min(firstResult + maxResult, hits.length);
- for (int i = firstResult; i < endIndex; i++) {
- Document hitDoc = isearcher.doc(hits[i].doc);
- Article article = DocumentUtils.document2Ariticle(hitDoc);
- //
- String text = highlighter.getBestFragment(LuceneUtils.getAnalyzer(), "content", hitDoc.get("content"));
- if (text != null) {
- article.setContent(text);
- }
- list.add(article);
- }
- ireader.close();
- return new QueryResult(count, list);
- } catch (Exception e) {
- logger.error("IndexDao.search error", e);
- }
- return null;
- }
- }
- lucence详细学习地址:http://www.cnblogs.com/zhuxiaojie/p/5277219.html
全文检索lucene6.1的检索方式的更多相关文章
- Hibernate —— HQL、QBC检索方式
一.HQL 检索方式 以双向的一对多来测试 HQL 检索方式.以 Department 和 Employee 为例. 建表语句: CREATE TABLE department ( dept_id ) ...
- Hibernate的检索方式
Hibernate的检索方式 检索方式(查询的方式) 导航对象图检索方式: 根据已经加载的对象导航到其他对象 Customer customer = (Customer)session.get(Cus ...
- 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)
本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...
- 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)
Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...
- hibernate检索方式(HQL 检索方式,QBC 检索方式,本地 SQL 检索方式)
hibernate有五种检索方式,这儿用 单向的一对多的映射关系 例子,这儿有后三种的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 ...
- Hibernate 检索方式
概述 •Hibernate 提供了以下几种检索对象的方式 –导航对象图检索方式: 根据已经加载的对象导航到其他对象 –OID 检索方式: 按照对象的 OID 来检索对象 –HQL 检索方式: 使用 ...
- Hibernate入门6.Hibernate检索方式
Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...
- [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate的三种常用检索方式
Hibernate 提供了以下几种检索对象的方式 ¨ 导航对象图检索方式: 根据已经加载的对象导航到其他对象 ¨ OID 检索方式: 按照对象的 OID 来检索对象 ¨ ...
随机推荐
- bzoj 3730: 震波 动态点分治_树链剖分_线段树
##### 题目描述 : 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i].不幸的是,这片土地常常发生地震,并且随着 ...
- HTML5新特性之文件和二进制数据的操作 Blob对象
HTML5新特性之文件和二进制数据的操作 1.Blob对象 2.FileList对象 3.File对象 4.FileReader 对象 5.URL对象
- 对于开启tomcat后无法登陆index.xml的新解决方法
首先这个问题是针对tomcat路径什么的都正确,但是就是无法登陆index.xml 如上图,之前忘了写<packaging>war</packaging>所以无法登陆index ...
- GDI Bezier 样条曲线(7)
Bezier 样条曲线 Bezier 样条曲线使用四个点来定义:两个端点(起点和终点)和两个控点(用于使其不同程度地弯曲). 绘制 Bezier 样条曲线 使用 PolyBezier 函数和 Poly ...
- URL编码及解码
为什么要对URL进行编码? 一般来说,网页URL只能使用英文.数字.还有一些特定的字符.根据网络标准RFC 1738做了硬性规定: 只有字母和数字[0-9a-zA-Z].一些特殊符号"$-_ ...
- 【JavaScript框架封装】实现一个类似于JQuery的动画框架的封装
// 动画框架 (function (xframe) { // 需要参与链式访问的(必须使用prototype的方式来给对象扩充方法) xframe.extend({}); // 不需要参与链式访问的 ...
- redi通过哨兵sentinel实现主从切换
本次实验主要为了让哨兵监听redis主从复制,当主节点关闭后,哨兵会选举一台从节点成为主节点,并且让其他从节点变成新主节点得从节点 本次理论需要三台机器,一主两从,为了方便用一台服务器开启三个实例,一 ...
- 轻量级Java EE开发框架设计系统应用架构
首先来说一下Java EE 概述 其中常说的三大框架即是:ssh Spring:功能强大的组件粘合济,能够将你的所有的java功能模块用配置文件的方式组合起来(还让你感觉不到spring的存在)成为一 ...
- 人脸识别中的harr特征提取(转)
影响AdaBoost人脸检测训练算法速度很重要的两方面是特征选取和特征计算.选取的特征为矩特征为Haar特征,计算的方法为积分图. (1)Haar特征: Haar特征分为三类:边缘特征.线性特 ...
- 多线程程序调用fork的现象