day55_电力项目_lucene在检索中的应用

day48_电力系统框架搭建 项目第一天(项目框架)1:项目介绍 参考:《项目分析笔记》和【文档】中的《国家电力系统技术点汇总(简历使用).doc》2:项目框架(SSH) 第一步:创建数据库(格式:UTF-8) 创建表: 第二步:创建项目(格式:UTF-8) 导入jar包(SSH) 第三步:持久层 (1)在cn.itcast.elec.domain中创建ElecText.javapublic class ElecT 阅读详情

项目第八天(资料图书管理)

1:导入Lucene相关的jar包

这里写图片描述

其中:
•lucene-core-3.6.2.jar(核心包)
•lucene-analyzers-3.6.2.jar(分词器)
•lucene-highlighter-3.6.2.jar(高亮)
•lucene-memory-3.6.2.jar(高亮)
•IKAnalyzer2012_u6.jar(中文分词器)

2:lucene原理图

(1)索引库操作原理
这里写图片描述

(2)索引库中存放数据原理
这里写图片描述

这里写图片描述

3:lucene开发原理(数据库与索引库同步)

这里写图片描述
数据库与索引库中存放相同的数据,可以使用数据库中存放的ID用来表示和区分同一条数据。

数据库中用来存放数据
索引库中用来查询、检索

检索库支持查询检索多种方式,
特点:
1:由于是索引查询(通过索引查询数据),检索速度快,搜索的结果更加准确
2:生成文本摘要,摘要截取搜索的文字出现最多的地方
3:显示查询的文字高亮
4:分词查询等

4:配置文件

(1)导入以下3个配置文件,放置到项目的资源路径下(类路径)
这里写图片描述

IKAnalyzer.cfg.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
<properties>  
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">ext.dic;</entry> 

    <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">stopword.dic;</entry> 

</properties>

ext.dic(扩展词库)
这里写图片描述

stopword.dic(停用词库)
这里写图片描述

因为这些词搜索没有意义。

5:索引库基本代码

(1)导入以下3个文件,放置到项目的util包下
这里写图片描述

Configuration.java


public class Configuration {

    //索引库的目录位置
    private static Directory directory;
    //分词器
    private static Analyzer analyzer;

    static{
        try {
            /**索引库目录为D盘indexDir*/
            directory = FSDirectory.open(new File("D:/indexDir/"));
            /**词库分词*/
            analyzer = new IKAnalyzer();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Directory getDirectory() {
        return directory;
    }
    public static Analyzer getAnalyzer() {
        return analyzer;
    }

}

分析:
/*索引库目录为D盘indexDir/
directory = FSDirectory.open(new File(“D:/indexDir/”));
表示指定索引库的位置,在D盘的indexDir文件夹下,索引库存放的数据将采用二进制的方式
/*词库分词/
analyzer = new IKAnalyzer();
表示分词器,对索引库新增数据和对索引库查询数据,都需要对操作的数据进行分词,将分词后的数据存放,查询的时候也要通过你的条件,分词查询和检索

FileUploadDocument.java

public class FileUploadDocument {

    /**将ElecFileUpload对象转换成Document对象*/
    public static Document FileUploadToDocument(ElecFileUpload elecFileUpload){
        Document document = new Document();
        String seqId = NumericUtils.intToPrefixCoded(elecFileUpload.getSeqId());
        //主键ID
        document.add(new Field("seqId",seqId,Store.YES,Index.NOT_ANALYZED));
        //文件名
        document.add(new Field("fileName", elecFileUpload.getFileName(), Store.YES, Index.ANALYZED));
        //文件描述
        document.add(new Field("comment", elecFileUpload.getComment(), Store.YES, Index.ANALYZED));
        //所属单位
        document.add(new Field("projId",elecFileUpload.getProjId(),Store.YES,Index.NOT_ANALYZED));
        //图纸类别
        document.add(new Field("belongTo",elecFileUpload.getBelongTo(),Store.YES,Index.NOT_ANALYZED));
        return document;
    }

    /**将Document对象转换成ElecFileUpload对象*/
    public static ElecFileUpload documentToFileUpload(Document document){
        ElecFileUpload elecFileUpload = new ElecFileUpload();
        Integer seqId = NumericUtils.prefixCodedToInt(document.get("seqId"));
        //主键ID
        elecFileUpload.setSeqId(seqId);
        //文件名
        elecFileUpload.setFileName(document.get("fileName"));
        //文件描述
        elecFileUpload.setComment(document.get("comment"));
        //所属单位
        elecFileUpload.setProjId(document.get("projId"));
        //图纸类别
        elecFileUpload.setBelongTo(document.get("belongTo"));
        return elecFileUpload;
    }
}

这里写图片描述

这里要注意:索引库中存放的数据要转换成Document对象(每条数据就是一个Document对象),并向Document对象中存放Field对象(每条数据对应的字段,例如主键ID、所属单位、图纸类别、文件名称、备注等),将每个字段中的值都存放到Field对象中

LuceneUtils.java

public class LuceneUtils {

    /**向索引库中新增数据*/
    public void saveFileUpload(ElecFileUpload elecFileUpload) {
        Document document = FileUploadDocument.FileUploadToDocument(elecFileUpload);
        try {
            IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_36,Configuration.getAnalyzer());
            IndexWriter indexWriter = new IndexWriter(Configuration.getDirectory(),indexWriterConfig);
            indexWriter.addDocument(document);
            indexWriter.close();
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }

    /**索引库中删除数据*/
    public void deleteFileUploadByID(Integer seqId) {
        //指定词条的最小单位,相当于id=1
        String id = NumericUtils.intToPrefixCoded(seqId);
        Term term = new Term("seqId", id);
        try {
            IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_36,Configuration.getAnalyzer());
            IndexWriter indexWriter = new IndexWriter(Configuration.getDirectory(),indexWriterConfig);
            indexWriter.deleteDocuments(term);
            indexWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        } 

    }

    /**使用搜索条件,从索引库中搜索出对应的结果*/
    public List<ElecFileUpload> searchFileUploadByCondition(String queryString,String projId,String belongTo) {
        List<ElecFileUpload> list = new ArrayList<ElecFileUpload>();
        try {
            IndexSearcher indexSearcher = new IndexSearcher(IndexReader.open(Configuration.getDirectory()));

            /**使用lucene的多条件查询,即boolean查询,即必须满足3个条件*/
            BooleanQuery booleanQuery = new BooleanQuery();
            //【按文件名称和描述搜素】搜素的条件
            if(StringUtils.isNotBlank(queryString)){
                //指定查询条件在文件名称和文件描述、所属单位、图纸类别的字段上进行搜索
                QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_36,new String[]{"fileName","comment"},Configuration.getAnalyzer());
                Query query1 = queryParser.parse(queryString);
                booleanQuery.add(query1,Occur.MUST);
            }
            //【所属单位】搜素的条件
            if(StringUtils.isNotBlank(projId)){
                Query query2 = new TermQuery(new Term("projId", projId));
                booleanQuery.add(query2, Occur.MUST);
            }
            //【图纸类别】搜素的条件
            if(StringUtils.isNotBlank(belongTo)){
                Query query3 = new TermQuery(new Term("belongTo", belongTo));
                booleanQuery.add(query3, Occur.MUST);
            }
            //返回前100条数据
            TopDocs topDocs = indexSearcher.search(booleanQuery, 100);
            //返回结果集
            ScoreDoc [] scoreDocs = topDocs.scoreDocs;
            /**设置高亮效果 begin*/
            Formatter formatter = new SimpleHTMLFormatter("<font color='red'>","</font>");
            Scorer scorer = new QueryScorer(booleanQuery);
            Highlighter highlighter = new Highlighter(formatter,scorer);
            //摘要大小(设置大点,最好比文件名大,因为文件名最好不要截取)
            int fragmentSize = 50;
            Fragmenter fragmenter = new SimpleFragmenter(fragmentSize);
            highlighter.setTextFragmenter(fragmenter);
            /**设置高亮效果 end*/
            if(scoreDocs!=null && scoreDocs.length>0){
                for(int i=0;i<scoreDocs.length;i++){
                    ScoreDoc scoreDoc = scoreDocs[i];
                    //使用内部惟一编号,获取对应的数据,编号从0开始
                    Document document = indexSearcher.doc(scoreDoc.doc);
                    /**获取高亮效果begin*/
                    /**返回文件名的高亮效果*/
                    String fileNameText = highlighter.getBestFragment(Configuration.getAnalyzer(), "fileName", document.get("fileName"));
                    //没有高亮的效果
                    if(fileNameText==null){
                        fileNameText = document.get("fileName");
                        if(fileNameText!=null && fileNameText.length()>fragmentSize){
                            fileNameText = fileNameText.substring(0, fragmentSize);
                        }
                    }
                    document.getField("fileName").setValue(fileNameText);
                    /**返回文件描述的高亮效果*/
                    String commentText = highlighter.getBestFragment(Configuration.getAnalyzer(), "comment", document.get("comment"));
                    //没有高亮的效果
                    if(commentText==null){
                        commentText = document.get("comment");
                        if(commentText!=null && commentText.length()>fragmentSize){
                            commentText = commentText.substring(0, fragmentSize);
                        }
                    }
                    document.getField("comment").setValue(commentText);
                    /**获取高亮效果end*/
                    //将Document转换成ElecFileUpload
                    ElecFileUpload elecFileUpload = FileUploadDocument.documentToFileUpload(document);
                    list.add(elecFileUpload);
                }
            }
        } catch (Exception e) {
            throw new RuntimeException();
        }

        return list;
    }
}

查看索引库中的数据,使用lukeall-3.5.0.jar:

这里写图片描述

6:需要掌握的知识点

先掌握lucene的思想,不用lucene实现看看是什么效果
在添加lucene的代码(LuceneUtils)试试lucene添加后的现象

day65_activiti Activiti第三天 采购流程监控 流程变量 连线分支第三天:采购流程监控:(重点) 进行采购业务流程的监控: 查询当前正在运行的流程 实现动态图(在流程定义图上标出当前结点的位置,使用红色的框) 查询结束的流程 查询某个流程下历史任务(从流程开始运行到当前所经历的所有任务) 查询某个用户所办理的历史任务流程变量:(重点) Global全局变量(掌握 阅读详情

相关推荐

day51_电力系统_用户管理

项目第四天(用户管理)1:需要的表这里一个用户对应多个用户职称附件,所有用户表和用户职称附件表是一个一对多的关系。2:项目中配置hibernate一对多的关系一对一端 (1)ElecUser.java (2)ElecUser.hbm.xml 多的一端(3)ElecUserFile.java (4)ElecUserFile.hbm.xml 3:jquery的ajax实现二级联动(1)页面

CSDN_AF的博客 1599

lucene-memory-3.6.2.jar

lucene-memory-3.6.2.jar包,需要的拿走

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01

当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。

weixin_49199313的博客 1144

lucene-core-3.6.2.jar

3.6.2版本是lucene的3x中最大的版本,也是3x中最稳定的版本,因此建设使用该版本。如果还是使用3.6.0或3.6.1,更要升级到该版本,因为该版本修复了部分以前版本的BUG。想下载源码包的,可以搜索源码包lucene-core-3.6.2-src.jar及lucene-queries-3.6.2.jar

Lucene 3.6.2关键词高亮显示实现例子

* @see 高亮功能属于Lucene的扩展功能(或者叫做贡献功能)   * @see 其所需jar位于Lucene-3.6.2.zip中的/contrib/highlighter/文件夹中   * @see 本例中需要以下4个jar   * @see lucene-core-3.6.2.jar   * @see lucene-highlighter-3.6.2.jar   * @see

md_555的专栏 743

lucene-analyzers-3.6.2.jar

lucene-analyzers-3.6.2.jar包,需要的领走

2.Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程

 1  Lucen目录介绍 2  lucene-core-3.6.2.jar是lucene开发核心jar包    contrib  目录存放,包含一些扩展jar包 3  案例 建立第一个Lucene项目lucene3_day1    (1)需要先将数据转换成为Document对象,每一个数据信息转换成为Field(String name

涂作权的博客 4230

在文章中获取关键字

首先需要的jar包 下载apache的lucene-core-3.6.2.jar,lucene-highlighter-3.6.2.jar,lucene-memory-3.6.2.jar,lucene-analyzers-3.6.2.jar和一个开源的工具包IKAnalyzer2012.jar。 版本一样要对应好IKAnalyzer2012之前的版...

weixin_33919941的博客 186

全文检索技术与Lucene的使用

概念 在谈全文检索之前,首先让我们来了解一下什么是信息检索。信息检索就是从信息集合中找出与用户需求相关的信息。被检索的信息除了文本外,还有图像、音频、视频等多媒体信息,这里我们只讨论文本信息的检索。 全文检索是信息检索技术的一种,主要是把用户的查询请求和全文中的每一个词进行比较,不考虑查询请求与文本语义上的匹配。在信息检索工具中,全文检索是最具通用性和实用性的。

紫羽风的博客 5522

day66_activiti_4

Activiti 第四天 组任务 网关课程安排:组任务: Candidate-user 候选人 Candidate-group 候选组(重点)网关(重点): ExclusiveGateway 排他网关 parallelGateway 并行网关 InclusiveGateway 包含网关综合案例(重点) 1 复习采购流程监控查询(常用,重点) 当前流程

CSDN_AF的博客 2785

day64_activiti

Activiti第二天 流程实例、个人任务课程安排:Api: 流程实例: 流程实例是什么? 启动流程实例的方法(掌握) 两种方法,第二种方法在企业开发常用(涉及和业务系统整合) 查询流程实例(掌握) 查询结果如何和业务整合。 流程实例的暂停和激活(了解) 个人任务: 个人任务分配方法。(掌握) 三种分配方法,以第二种(UEL表达

CSDN_AF的博客 2690

day58_lucene详细

1.全文检索基础1.1.我们身边的搜索功能1.Windows系统中的有搜索功能:打开“我的电脑”,按“F3”就可以使用查找的功能,查找指定的文件或文件夹。搜索的范围是整个电脑中的文件资源。 2.Eclipse中的帮助子系统:点击HelpHelp Contents,可以查找出相关的帮助信息。搜索的范围是Eclipse的所有帮助文件。 3.在BBS、BLOG、新闻等系统中提供的搜索文章的功能,如这里的贴

CSDN_AF的博客 1773

day63_activiti

Activiti四天课:第一天:流程定义、流程部署 Activiti是什么?(掌握) Activiti解决了什么问题?(掌握)流程定义(掌握) 流程定义部署(掌握)第二天:流程实例、个人任务 以完整的业务流程,用activiti实现。 Activiti是如何开发!!!第三天:流程监控、流程变量、连接(流程分支) Activiti深入学习,将案例流程进行完善 第

CSDN_AF的博客 1549

day57_电力项目_图形报表&项目分析

项目第十天(图形报表+项目开发流程)1:Jfreechart报表属于工厂模式:提供ChartFactory类,由ChartFactory类创建各种图形 (1)柱状图:原理: 代码: public static void main(String[] args) { //图形的数据集合 DefaultCategoryDataset dataset = new D

CSDN_AF的博客 1534

day88_shiro_2

shiro第二天 shiro授权 shiro和企业项目整合开发8 复习什么是权限管理? 权限管理是系统的安全范畴,要求必须是合法的用户才可以访问系统(用户认证),且必须具有该 资源的访问权限才可以访问该 资源(授权)。 认证:对用户合法身份的校验,要求必须是合法的用户才可以访问系统。 授权:访问控制,必须具有该 资源的访问权限才可以访问该 资源。权限模型:标准权限数据模型包括 : 用户、 角色

CSDN_AF的博客 1530
上一篇: day54_电力项目_webservice改造&报表导出基础
下一篇: day56_电力项目_POI导出JXL导入
csdn_AF
博客等级 码龄9年 161粉丝 122原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值