全文检索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 来检索对象 ¨ ...
随机推荐
- Linux常用命令速查
索引表格 命令 功能简述 目录与文件基本操作 pwd 显示当前目录 ls 列出目录和文件名称 cp 复制文件或目录 mv 移动或更名现有的文件或目录 rm 删除文件或目录 mkdir 新建目录 rmd ...
- timeval的时间转换成毫秒之后多大的数据类型可以装下
struct timeval { long tv_sec; /*秒*/ long tv_usec; /*微秒*/ }; 秒的定义为long,为了防止溢出,转换成毫秒之后保存在long long中
- linux github 添加ssh
1.本地生成key, xxx 是github 的账号, 执行下面命令一路下一步 ssh-keygen -t rsa -C "xxx" 2.复制下面的public key 到git ...
- Python for Tkinter
# tkinter常用组件- 按钮 - button(按钮组件) - RadioButton(单选框组件) - CheckButton(选择按钮组件) - Listbox(列表框组件) - 文本输入组 ...
- Android使用C代码
Android调用C代码 1.开发工具:Android studio 2.0 2.开发前准备: 2. 3. 4.下面我们就来开发我们的程序吧, [1]创建一个java类 package com.adm ...
- 使用sdk自带工具uiautomatorviewer查看app控件属性
双击打开即可 其只显示模拟器中的当前页面,所以需要在模拟器中打开你需要的页面,然后刷新
- sw算法求最小割学习
http:// blog.sina.com.cn/s/blog_700906660100v7vb.html 转载:http://www.cnblogs.com/ylfdrib/archive/201 ...
- kfka学习笔记一:使用Python操作Kafka
1.准备工作 使用python操作kafka目前比较常用的库是kafka-python库,但是在安装这个库的时候需要依赖setuptools库和six库,下面就要分别来下载这几个库 https://p ...
- 0108MySQL集群搭建详解(三种结点分离)
转自http://blog.csdn.net/yang1982_0907/article/details/20716845,感谢博主 本文将搭建一个最简化的MySQL Cluster系统,配置方法中的 ...
- pl/sql输入括号后卡顿的解决方式
pl/sql输入括号后卡顿的解决方式 学习了:https://zhidao.baidu.com/question/298275368.html 工具->首选项->用户界面->代码助手 ...