【lucene】一个简单的招聘网站的建立
1.建立索引库: 核心代码如下
package com.tabchanj.job.index; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.Scorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter; import com.tabchanj.job.domain.JobApply;
import com.tabchanj.job.util.LuceneUtils; @SuppressWarnings("deprecation")
public class JobApplyIndexHelper { public void createIndex(List<JobApply> jobApplies, boolean rebuild) {
// 索引写入器,要保证全应用只有一个写入器,多个写入器同时写入会报错
try {
IndexWriter indexWriter = LuceneUtils.getIndexWriter();
if (rebuild) {
indexWriter.deleteAll();
indexWriter.commit();
}
for (JobApply jobApply : jobApplies) {
// 将每一条数据包装为document
Document document = obj2Doc(jobApply);
// 添加到索引库中
indexWriter.addDocument(document);
}
indexWriter.commit();
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
} private Document obj2Doc(JobApply jobApply) {
Document document = new Document();
document.add(new Field("id", jobApply.getId() + "", Store.YES, Index.NO));
document.add(new Field("title", jobApply.getTitle(), Store.YES, Index.NO));
document.add(new Field("content", jobApply.getContent(), Store.NO, Index.ANALYZED));
document.add(new Field("companyId", jobApply.getCompany().getId() + "", Store.YES, Index.NOT_ANALYZED));
document.add(new Field("companyName", jobApply.getCompany().getName(), Store.YES, Index.ANALYZED));
document.add(new Field("cityName", jobApply.getCity().getName(), Store.YES, Index.ANALYZED));
document.add(new Field("cityId", jobApply.getCity().getId() + "", Store.YES, Index.NOT_ANALYZED));
document.add(new Field("tradeId", jobApply.getTrade().getId() + "", Store.YES, Index.NOT_ANALYZED));
document.add(new Field("tradeName", jobApply.getTrade().getName(), Store.YES, Index.ANALYZED));
document.add(new Field("salaryScope", jobApply.getSalaryLevel().getName(), Store.YES, Index.ANALYZED));
document.add(new Field("salaryId", jobApply.getSalaryLevel().getId() + "", Store.YES, Index.NOT_ANALYZED));
return document; }
//上面使用的LuceneUtils工具类代码如下:
package com.tabchanj.job.util; import java.io.File; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer; /**
* Lucene通用工具
*
* @author tab
*
*/
public class LuceneUtils {
// 创建索引库
private static Directory directory = null;
// 创建词法分析器
private static Analyzer analyzer = new IKAnalyzer();
// 创建索引写入器
private static IndexWriter indexWriter = null; public static Analyzer getAnalyzer() {
return analyzer;
} /**
* 获取索引库文件路径
*
* @return
*/
public static String getIndexPath() {
StringBuilder pathname = new StringBuilder(Global.webAppPath);
pathname.append("WEB-INF").append(File.separator).append("index").append(File.separator);
return pathname.toString();
} /**
* 获取索引库directory对象
*
* @return
*/
public static Directory getDirectory() {
try {
if (directory == null) {
directory = FSDirectory.open(new File(getIndexPath()));
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
return directory;
} /**
* 获取indexWriter
*
* @return
*/
public static IndexWriter getIndexWriter() {
try {
if (indexWriter == null) {
synchronized (LuceneUtils.class) {
if (indexWriter == null) {
Version version = Version.LUCENE_4_10_4;
indexWriter = new IndexWriter(getDirectory(), new IndexWriterConfig(version, getAnalyzer()));
}
}
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
return indexWriter;
} /**
* 关闭indexWriter
*/
public static void closeIndexWriter() {
try {
if (indexWriter != null) {
indexWriter.close();
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
} } }
//上面用到的Gloal.webappPath常量如下
package com.tabchanj.job.util;
public class Global {
public static String webAppPath="";
}
//用于在容器启动时通过下面的监听器给Global.webappPath常量赋值
package com.tabchanj.job.listener; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; import com.tabchanj.job.util.Global;
import com.tabchanj.job.util.LuceneUtils; public class WebAppListener implements ServletContextListener { @Override
public void contextDestroyed(ServletContextEvent event) {
LuceneUtils.closeIndexWriter();
} /**
* 在容器启动时,初始化项目根目录常量
*/
@Override
public void contextInitialized(ServletContextEvent event) {
Global.webAppPath = event.getServletContext().getRealPath("/");
}
}
2.查询索引库: 核心代码如下
/**
*
* 搜索索引库
*
* @param query
*/
public List<Map<String, Object>> search(Query query) {
List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>();
try {
// 加载索引库
IndexReader reader = IndexReader.open(LuceneUtils.getDirectory());
// 获取加载了Indexreader的索引搜索器
IndexSearcher searcher = new IndexSearcher(reader);
// 获取结果对象
TopDocs docs = searcher.search(query, 1000);
// 获取结果数组
ScoreDoc[] socres = docs.scoreDocs;
// 创建高亮器=========================================================
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");//设置关键字的高亮格式
Scorer fragmentScorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter, fragmentScorer);
Fragmenter fragmenter = new SimpleFragmenter(200);//设置包含关键字的片段长度
highlighter.setTextFragmenter(fragmenter );
// ====================================================================
// 遍历结果数组
for (ScoreDoc scoreDoc : socres) {
// 获取文档编号
int docNumber = scoreDoc.doc;
// 根据编号搜索文档
Document document = searcher.doc(docNumber);
// 把文档相应的字段封装到集合的map中
Map<String, Object> map = new HashMap<String, Object>();
// 在需要的字段使用高亮器
String title = highlighter.getBestFragment(LuceneUtils.getAnalyzer(), "title", document.get("title"));
System.out.println("title:before="+title);
//针对title中没有出先搜索的关键字的title直接输出其本来内容
if (title == null) {
title = document.get("title");
}
System.out.println("title:after="+title);
map.put("title", title);
map.put("city", document.get("cityName"));
map.put("company", document.get("companyName"));
map.put("trade", document.get("tradeName"));
map.put("salaryScope", document.get("salaryScope"));
lists.add(map);
} } catch (Exception e) {
e.printStackTrace();
// throw new RuntimeException(e.getMessage());
}
return lists;
}
3.关键字高亮: 代码在第二步中
【lucene】一个简单的招聘网站的建立的更多相关文章
- php实现一个简单的购物网站
实现一个简单的购物网站 一.考试时间:8小时 二.开发工具:DW 三.数据库:见附件 四.需要实现的页面: Index:浏览商品页面,显示商品列表,用户可以点击“购买“. ViewCart:查看购物车 ...
- [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)
一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...
- Ruby学习笔记2 : 一个简单的Ruby网站,搭建ruby环境
Ruby on Rails website 的基础是 请求-返回 循环. 首先是浏览器请求服务器, 第二步,Second, in our Rails application, the route ta ...
- 3.2 Lucene实战:一个简单的小程序
在讲解Lucene索引和检索的原理之前,我们先来实战Lucene:一个简单的小程序! 一.索引小程序 首先,new一个java project,名字叫做LuceneIndex. 然后,在project ...
- Django 学习笔记之六 建立一个简单的博客应用程序
最近在学习django时建立了一个简单的博客应用程序,现在把简单的步骤说一下.本人的用的版本是python 2.7.3和django 1.10.3,Windows10系统 1.首先通过命令建立项目和a ...
- django 建立一个简单的应用
本人的用的版本是python 2.7.3和django 1.10.5,Windows10系统 1.首先通过命令建立项目和app 找到django的安装路径,我的路径是:C:\Python27\Lib\ ...
- 【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement
本blog提供了一个简单的通过JDBC驱动建立JDBC连接例程.并分别通过Statement和PreparedStatement实现对数据库的查询. 在下一篇blog中将重点比較Statement与P ...
- quartz---的一个简单例子
quartz---的一个简单例子 首先建立一个maven项目.jar工程即可.(提示:我前面有如何建立一个maven工程的总结以及maven环境的配置.) 1.建立好后点击到app中运行,--> ...
- Redis 实战 —— 11. 实现简单的社交网站
简介 前面介绍了广告定向的实现,它是一个查询密集型 (query-intensive) 程序,所以每个发给它的请求都会引起大量计算.本文将实现一个简单的社交网站,则会尽可能地减少用户在查看页面时系统所 ...
随机推荐
- oracle 查看表空间使用比
select b.file_name 物理文件名, b.tablespace_name 表空间, b.bytes / / 大小M, (b.bytes - sum(nvl(a.bytes, ))) / ...
- 内存数据库:Redis与Memcached的区别
Redis与Memcached的区别 传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都 ...
- TYPES与DATA区别
例如:int a; "c语言定义 TYPES:BEGIN OF typ, filed1 TYPE c, END OF typ. "相当于int类型 DAT ...
- linux常用命令(20)用SecureCRT来上传和下载文件
用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem. ...
- C基础知识(8):结构体、共用体、位域
结构体 数组允许定义可存储相同类型数据项的变量,而结构体是C编程中另一种用户自定义的可用的数据类型,它允许用户可以存储不同类型的数据项. struct 语句的格式如下: struct [structu ...
- js继承的实现(原型/链、函数伪装)
一.原型继承父类的实例 //父类及其原型属性/方法 function SuperType () { this.name = ['zc','ls','ww']; } SuperType.prototyp ...
- 用xcode打包完成,出现的Archive界面怎么打开?
要出现这个界面 只需在xcode界面进入windows 的下拉菜单Organizer
- 使用 Vulkan * API 并行渲染对象
Vulkan API 是业界最热门的新技术之一.它们支持多线程编程,可以简化跨平台开发,而且主要的芯片.GPU 和设备制造商都为其提供支持.Vulkan API 有望成为未来主流图形渲染平台之一.该平 ...
- linux(centos7)下SVN服务器搭建
https://www.cnblogs.com/fuyuanming/p/6123395.html linux(centos)下SVN服务器如何搭建?说到SVN服务器,想必大家都知道,可以是在LINU ...
- 03-MySQL多表操作
一.表之间的关系 1.如何找出两张表之间的关系 分析步骤: #.先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是 ...