最新要闻
- 国风开放世界新作:网易新游《暂时叫它:天字七六》公布
- 世界今热点:全新MacBook要用OLED屏!如果不烧屏还是挺香的
- 或8万起售 比亚迪海鸥四颜色曝光:绿、黑、白、粉你选谁
- 这可能是最好看的RX 7900 XTX:华擎发布太极白色版
- 科大讯飞刘聪:5月6日将发布“1+N认知智能大模型”
- 泫雅和张贤胜的组合叫什么?泫雅和张贤胜在一起过吗?
- 蛇沼鬼城后面一部是什么?蛇沼鬼城录像带里的吴邪是谁?
- 张一山为什么剃光头?张一山出演的电视剧有哪些?
- 南派三叔为什么要封笔?南派三叔的全部作品顺序
- 被嫌弃的松子的一生讲了什么? 松子一生坎坷结局是怎么死的?
- 【新视野】山西省印发钢铁行业转型升级2023年行动计划
- 拼多多百亿补贴“厂家直销”受阻:京东自营再现“排他性”竞争
- 细思极恐!韩国分析日本农产品超20%检出放射性物质铯
- 环球热讯:南财基金通·混合型基金收益排行榜(4月6日)
- 焦点日报:买车更方便!新车上牌免查验试点新增21个城市:看看有你家吗
- 天天资讯:工资6000面试6轮当事人发声:没被录用 可能介意我年龄大
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
焦点热门:全文索引:Apache Lucene(一)
(资料图片)
做网站门户,全文检索功能必不可少。如何快速、准确的罗列出用户想要的查询结果,是查询的主要目标。模糊查询是最常见的查询,在做单一模块时,我们通常用Like来检索。【like "%张%"】即检索含有 "张" 字符的项,是从头开始-->的全文匹配。Like的查询原理就是使用索引和匹配算法,如果该字段的值符合匹配模式,那么这条记录就会被选中。在使用了通配符%后,查询效率会大大降低,因为需要扫描整张表【注:当需要频繁使用 Like 查询,建议在数据库中为相应的字段建立索引】。对于数据量小时,Like的查询效率还算可以,但数据量大时每一次的查询扫描全表,查询效率大大降低。索引是对数据库表中一列或多列的值进行排序的一种结构,建立索引之后字段会排序变成有规则的结构性项,如a,b,c,d。查询字段时。 对没有建立索引的字段进行Like查询,是对非结构性字段从第一条到表的最后一条选中匹配结果;当字段建立索引时,查询可以快速的定位到含查询词的项进行匹配,不必查询整个表。
而网站门户的全文检索,不仅仅是对单表的查询,应当是对整个网站的公示信息进行查询。比如你是个政府网站,全文检索应该包含:办事服务,政务动态,政策文件,互动交流,信息公开等。再用Like单表来拼接结果的想法显然靠不住,这时候Apache Lucene就登场了。Apache Lucene是一个开源的高性能、可扩展的信息检索引擎,提供了强大的数据检索能力。后面再归纳Lucene的原理,这篇先写实现。
1 首先引入lucene相关jar包,pom.xml添加
5.5.2 org.apache.lucene lucene-analyzers-common --分词器${lucene.version} org.apache.lucene lucene-backward-codecs --用于读取旧版本的索引,实现索引格式化${lucene.version} org.apache.lucene lucene-core --核心处理:解析,解码,存储格式,索引,搜索,存储和工具类${lucene.version} org.apache.lucene lucene-highlighter --文本高亮${lucene.version} org.apache.lucene lucene-memory --内存${lucene.version} org.apache.lucene lucene-queryparser --解析构建Query对象${lucene.version}
2 抽出一个对象类来负责全文检索。该对象按照需求添加属性:如id,标题,分类,时间,请求路径(pc,移动端)
//搜索结果entitypublic class SearchResult { private String id; private String title; // 用于查询和显示的摘要信息 private String category; // 分类 private String time; // 文章或消息创建时间 private UrlParam urlParam; // 详情请求路径,包含参数设置 private UrlParam mobileParam; // 移动端请求路径,包含参数设置}
//URL参数public class UrlParam { private String path; // 请求路径 private String id; // id参数 private String category; // 分类参数}
3 在启动服务时以及定时任务,建立及更新索引:
/*** 创建索引*/public void creatIndex(){ System.out.println("----------------删除索引----------------"); try { searchDao.delete(); } catch (IOException e) { e.printStackTrace(); System.out.println("删除索引失败"); } int count =0; starmili = System.currentTimeMillis(); System.out.println("----------------开始创建索引----------------"); try{ //办事服务 count += addWorkToIndex(); //政策文件 count += addArticleToIndex(); //信息公开 count += addInformationToIndex(); }catch(Exception e){ e.printStackTrace(); System.out.println("创建索引失败"); } endmili = System.currentTimeMillis(); System.out.println("成功创建索引:" + count + " 个,共耗时:" + (endmili - starmili) + "毫秒"); System.out.println("----------------创建索引结束----------------\n\n");}//获取办事服务数据加入索引private int addWorkToIndex(){ ListView CoderesultList = new LinkedList (); List workinfolist = workService.findList(new Workinfo()); if(workinfolist != null && !workinfolist.isEmpty()){ for(Workinfo work : workinfolist){ SearchResult result = new SearchResult(); result.setId(work.getId()); result.setTitle(work.getTitle()); result.setCategory(SearchEnum.WORKINFO.getCategory()); result.setTime(work.getCreateDate()); // 详情请求路径 UrlParam urlParam = new UrlParam(); urlParam.setPath(SearchEnum.WORKINFO.getPath()); urlParam.setId(work.getId()); urlParam.setCategory(SearchEnum.WORKINFO.getCategory()); result.setUrlParam(urlParam); // 移动端 UrlParam mobileParam = new UrlParam(); mobileParam.setPath(SearchEnum.WORKINFO.getMobilePath()); mobileParam.setId(work.getId()); mobileParam.setCategory(SearchEnum.WORKINFO.getCategory()); result.setMobileParam(mobileParam); resultList.add(result); } return searchDao.createIndex(resultList); } return 0;}//获取政策文件数据加入索引private int addArticleToIndex(){ List resultList = new LinkedList (); List articlelist = articleService.findList(new Article()); if(articlelist != null && !articlelist.isEmpty()){ for(Article art : articlelist){ if(art != null && art.getCategory() != null){ SearchResult result = new SearchResult(); result.setId(art.getId()); result.setTitle(art.getTitle()); result.setCategory(art.getCategory().getName()); result.setTime(art.getCreateDate()); // 详情请求路径 UrlParam urlParam = new UrlParam(); urlParam.setPath(SearchEnum.ARTICLE.getPath()); urlParam.setId(art.getId()); urlParam.setCategory(art.getCategory().getName()); result.setUrlParam(urlParam); // 移动端 UrlParam mobileParam = new UrlParam(); mobileParam.setPath(SearchEnum.ARTICLE.getMobilePath()); mobileParam.setId(art.getId()); mobileParam.setCategory(art.getCategory().getName()); result.setMobileParam(mobileParam); resultList.add(result); } } return searchDao.createIndex(resultList); } return 0;}
/** * 生成索引 * @param list * @return 生成索引数目 */public int createIndex(Listlist){ IndexWriter writer = null; FSDirectory dir = null; Analyzer analyzer = null; int count = 0;//计数器 try { String indexPath = "索引存放位置"; dir = FSDirectory.open(Paths.get(indexPath)); analyzer = new StandardAnalyzer(); IndexWriterConfig config = new IndexWriterConfig(analyzer); writer = new IndexWriter(dir, config); for(SearchResult result : list){ Document doc = new Document(); doc.add(new StringField(SearchResult.SERACH_ID, result.getId(), Store.YES)); doc.add(new TextField(SearchResult.SERACH_TILTE, result.getTitle(), Store.YES)); doc.add(new TextField(SearchResult.SERACH_CATEGORY, result.getCategory(),Store.YES)); doc.add(new StoredField(SearchResult.SERACH_TIME, result.getTime())); doc.add(new StoredField(SearchResult.SERACH_URL, result.getUrlParam().getUrl())); doc.add(new StoredField(SearchResult.SERACH_MOBILE_PATH, result.getMobileParam().getUrl())); writer.addDocument(doc); count++; } writer.commit(); } catch (IOException e) { e.printStackTrace(); } finally { analyzer.close(); try { writer.close(); } catch (IOException e) { e.printStackTrace(); } dir.close(); } return count;}
4 查询功能的实现
/** * 查询 * @param question 模糊字符 * @throws IOException */public ListgetResult(String question) throws Exception{ if(StringUtils.isNotEmpty(question)){ question = question.replaceAll(";", "").replaceAll(";", "").replaceAll("\\[", "") .replaceAll("\\]", "").replaceAll("&", "").replaceAll("\\(", "").replaceAll("\\)", ""); } List list = new LinkedList (); IndexReader reader = getIndexReader(); reader.incRef(); IndexSearcher indexSearcher = new IndexSearcher(reader); Analyzer analyzer = new StandardAnalyzer(); QueryParser parse = new MultiFieldQueryParser(new String[]{"title","category"}, analyzer); //标题和分类进行检索 Query query = parse.parse(question); TopDocs topDocs = indexSearcher.search(query, 200); ScoreDoc[] scoreDocs = topDocs.scoreDocs; for(ScoreDoc scoredoc : scoreDocs){ Document doc = indexSearcher.doc(scoredoc.doc); SearchResult result = new SearchResult(); result.setId(doc.get(SearchResult.SERACH_ID)); result.setCategory(doc.get(SearchResult.SERACH_CATEGORY)); result.setTitle(toHighlighter(query, doc, SearchResult.SERACH_TILTE, analyzer, true)); //高亮 result.setTime(doc.get(SearchResult.SERACH_TIME)); result.setUrl(doc.get(SearchResult.SERACH_URL)); result.setMobilePath(doc.get(SearchResult.SERACH_MOBILE_PATH)); list.add(result); } indexreader.decRef(); return list;}//获取Indexreaderprivate IndexReader getIndexReader(){ try { Directory directory = FSDirectory.open(Paths.get(indexPath)); if(indexreader == null){ indexreader = DirectoryReader.open(directory); }else{ IndexReader tempReader = DirectoryReader.openIfChanged((DirectoryReader)indexreader);//如果索引有变更,则生成新的IndexReader if(tempReader != null){ indexreader.close(); indexreader = tempReader; } } } catch (IOException e) { e.printStackTrace(); } return indexreader;}
5 效果展示,全文检索:办事指南
关键词:
焦点热门:全文索引:Apache Lucene(一)
天天热讯:Java 自增自减运算符和移位运算符介绍
世界观速讯丨NTP时间同步服务器(频率同步)包含帧同步、载波同步、位同步
sms-activate短信验证码问题
世界新资讯:153. 寻找旋转排序数组中的最小值
【财经分析】新规创新保险服务模式 完善多层次长期护理保障制度
国风开放世界新作:网易新游《暂时叫它:天字七六》公布
世界今热点:全新MacBook要用OLED屏!如果不烧屏还是挺香的
或8万起售 比亚迪海鸥四颜色曝光:绿、黑、白、粉你选谁
这可能是最好看的RX 7900 XTX:华擎发布太极白色版
科大讯飞刘聪:5月6日将发布“1+N认知智能大模型”
泫雅和张贤胜的组合叫什么?泫雅和张贤胜在一起过吗?
蛇沼鬼城后面一部是什么?蛇沼鬼城录像带里的吴邪是谁?
张一山为什么剃光头?张一山出演的电视剧有哪些?
南派三叔为什么要封笔?南派三叔的全部作品顺序
被嫌弃的松子的一生讲了什么? 松子一生坎坷结局是怎么死的?
【新视野】山西省印发钢铁行业转型升级2023年行动计划
全球播报:[Web Server]Tomcat调优之监控连接池/线程池
焦点快播:(笔记)电源缓启动工作原理
世界速看:详解 Flink Catalog 在 ChunJun 中的实践之路
【环球速看料】Python selenium过图片滑块验证
拼多多百亿补贴“厂家直销”受阻:京东自营再现“排他性”竞争
细思极恐!韩国分析日本农产品超20%检出放射性物质铯
环球热讯:南财基金通·混合型基金收益排行榜(4月6日)
【天天热闻】Java中子类重写父类方法的思想本质!
头条焦点:CRLF和LF区别
焦点日报:买车更方便!新车上牌免查验试点新增21个城市:看看有你家吗
天天资讯:工资6000面试6轮当事人发声:没被录用 可能介意我年龄大
当前观察:出游正值好春光!“五一”旅游需求爆发
为何全球这么多人首选iPhone:苹果保值率第一 安卓机惨
环球资讯:气象台:未来十天冷空气影响频繁 9日起沙尘天气将卷土重来
天天动态:分库分表之ShardingSphere
要闻:新农保和社保可以同时交不_新农保和社保可以同时交
真不是人扮的?黑猩猩吃完饭主动到水池里洗盘子游客看呆
每日速看!离地球最近的黑洞被发现!科学家:还有许多黑洞待发现
焦点日报:比亚迪百万级纯电超跑!仰望U9确定参加上海车展:加速2秒级
中规中矩!杜兰特半场10中4得11分5板2助 共出现3次失误
天天资讯:开源即时通讯IM框架MobileIMSDK的微信小程序端开发快速入门
ONLYOFFICE 安装对接指南
今日快看!极氪员工泄露文件 疑与投诉车主沟通删帖内幕曝光!客服回应
环球关注:3折奔驰GLS很香?博主理性分析29万买北汽BJ90:不如现代帕里斯帝
热文:巨头联手!抖音宣布与腾讯视频合作:可以合法二创了
焦点报道:岚图汽车公开挑战保时捷、奥迪、蔚来和极氪 网友:你“图”什么
每日播报!全国56门店通用:瑞慈全身体检套餐279元大促(800元券)
全球热头条丨瓶装75度的酒精怎么使用?
天天最新:分库分表以后如何对非Sharding键进行查询?
全球最新:Flutter 的优缺点及前景
世界看热讯:人社部要求各地充分挖掘就业渠道 兜牢青年就业底线
焦点消息!搞事情?日本、韩国科学家联手发现未知铀同位素 半衰期超短
世界信息:锐龙7 7800X3D闪电登上热销第一!锐龙9 3D立刻大降价
天天新消息丨比亚迪云辇系统重要信息提前透露:为智能车身控制
iPhone 8以上都能用!中国广电5G宣布:已全面支持iPhone
环球消息!一人之下!特斯拉任命朱晓彤为汽车业务高级副总裁
世界最新:研究:ChatGPT影响用户道德判断
低至2.5折!Epic春季特卖来了:超1800款游戏便宜卖
读SQL进阶教程笔记09_HAVING上
【全球聚看点】【读财报】3月上市公司再融资动态:定增实际募资693亿元 邮储银行、中核钛白募资额居前
RTX 4070官方走光:NVIDIA声称4799元很便宜!
全球看点:为了逃离俄罗斯:美国思科狠心销毁1.6亿元设备
当前速看:沙特俄罗斯减产 油价看高至100美元:美国难受 但日韩最遭殃
全球快报:昊华科技:4月6日融资买入87.08万元,融资融券余额9058.06万元
【新视野】2、XmlBeanFactory 的类图介绍.md
全球观点:执行orachk检查数据库环境
今日快讯:姆总很生气!头号射手和大巴黎翻脸,想要姆巴佩原谅必须得加钱
【独家焦点】王者面前蹦迪 本田思域高速见缝插针式变道被撞惨
今日观点!人死后葬礼要花多少钱?为什么现在的死亡成本这么高?
全球微速讯:百元级主板也能上游戏神U 微星A620升级支持锐龙7 7800X3D
麦当劳是怎么在年轻人心中封神的?
卫生间、厨房还是阳台? 新房装修洗衣机真不能随便放
春泉产业信托(01426.HK)4月6日回购6万个基金单位
【聚看点】数据库系统原理之数据管理技术的发展
每日速读!《泰坦尼克号》女主参演阿凡达2上热搜:对大海有执念
每日焦点!GPD Win Max掌机抢先升级AMD 4nm Zen4!核显无敌
每日信息:104MB缓存灭掉i9-13900KS!AMD锐龙7 7800X3D正式开卖:3299元神性价
热门看点:摩托车驾驶证到期怎么换(摩托车驾驶证到期换证流程)
【新视野】Python + edge-tts:一行代码,让你的文本轻松变成语音!
RL 的探索策略 | Exploration for RL
全球讯息:ORACLE数据库中ORACLE_SID与INSTANCE_NAME的差异
全球观点:geant4基础操作
全球动态:应急响应基础技能
全球速递!兴业银行上线人民币跨境支付系统债券通直通服务
天天快资讯:【财经分析】宏观经济预期改善支撑英镑兑美元汇率走高
女友争吵后高速路上要跳车 宝马男急忙应急车道 现场火药味十足
全球速看:不怵清华北大的中南大学:正批量造富
巨石强森演《终结者》T800是啥样?AI绘制以假乱真
焦点关注:债市日报:4月6日
天罡股份4月13日北交所上会:参与20多项行业标准和技术规范制定
超导石墨烯一粒用三年!南孚传应纽扣电池5粒只要7.9元
环球快资讯丨猩猩被游客扔瓶子砸头后扔回反击 动物园回应被教坏了:网友直呼做的对
ROG游戏手机7 Pro外观曝光:经典电竞小屏、横向三摄
【焦点热闻】Springboot+HTML5+Layui2.7.6上传文件【请求上传接口出现异常】
4299元 宏碁XV275K P3显示器上架:4K Mini LED屏、160Hz高刷
网友29元坐高铁商务座 薅到零食、盒饭“羊毛”!网友热议
【天天快播报】老版本被放弃!Steam将终止对macOS 10.11/10.12系统支持
日本人要搞二次元老婆版ChatGPT:感觉AI成人娃娃也快来了
环球今日讯!女子突然呼吸困难地铁工作人员为她戴严口罩:网友竟然齐声叫好!
生日礼物女生送什么好_女生送这些生日礼物好
当前热议!在线商城爬虫 带爬取记录 以11TREET 为例
世界消息!AIRIOT赋能水务行业深度转型,打造智慧水务“四化建设”
焦点热议:常用Content-Type汇总