全文检索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 来检索对象 ¨ ...
随机推荐
- 【转】Oracle基础结构认知—初识oracle 礼记八目 2017-12-12 21:19:30
Oracle服务器(oracle server)由实例和数据库组成.其中,实例就是所谓的关系型数据库管理系统(Relational Database Management System,RDBMS), ...
- nyoj399-整除个数
整除个数 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 1.2.3- -n这n(0<n<=1000000000)个数中有多少个数可以被正整数b整除. 输入 ...
- vue 如何清除定时器
在页面中需要定时刷新局部数据,在数据变化是否频繁的情况下,没有必要使用webSocket,因为数据变化频繁,数据实时变化太快看不清楚.因此页面会定时调用后台接口以达到实时刷新数据的效果. 1.在dat ...
- 猫狗分类--Tensorflow实现
贴一张自己画的思维导图 数据集准备 kaggle猫狗大战数据集(训练),微软的不需要FQ 12500张cat 12500张dog 生成图片路径和标签的List step1:获取D:/Study/Py ...
- BZOJ 3674 可持久化并查集加强版(路径压缩版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
- spring mvc流程理解
1.controller处理的终究就是一个结果,默认是modelandview对象,controller里自己随便调用service或者dao,终究都还是在controller里有返回值. 2. 在 ...
- POJ 2470 Ambiguous permutations(简单题 理解题意)
[题目简述]:事实上就是依据题目描写叙述:A permutation of the integers 1 to n is an ordering of these integers. So the n ...
- pl/sql sql窗口允许输出和允许变量替换
pl/sql sql窗口允许输出和允许变量替换 允许输出:类似在命令窗口中输入的 setserveroutput on; 允许变量替换:如果点击了这个,类似于执行 set define off命令 在 ...
- 基于nginx的TCP Proxy实现数据库读写分离
nginx非常早就支持tcp proxy.可是一直不知道其使用,近期在nginx blog上看见了.一些实践者将其运用到数据库訪问的负载均衡以及实现读写分离,来提高数据库的吞吐量,这里我不会讲详细的搭 ...
- [ACM] FZU 1686 神龙的难题 (DLX 反复覆盖)
Problem 1686 神龙的难题 Accept: 444 Submit: 1365 Time Limit: 1000 mSec Memory Limit : 32768 KB Pro ...