【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) 程序,所以每个发给它的请求都会引起大量计算.本文将实现一个简单的社交网站,则会尽可能地减少用户在查看页面时系统所 ...
随机推荐
- DP&图论 DAY 6 上午
DP&图论 DAY 6 上午 双连通分量 从u-->v不存在必经边,点 点双连通分量 边双连通分量 点/边双连通分量缩点之后变成一个树 找连通块的时候不越过割点或者桥 P3469 [ ...
- SQL Server 数据库设计、命名、编码规范
https://blog.csdn.net/songguozhi/article/details/5858159 SQL Server 数据库设计.命名.编码规范
- 淘宝TAE平台定时任务包的部署步骤
淘宝TAE平台定时任务包的部署: 第一步:首先把自己的任务打包成一个jar包.使用maven打包的命令为:mvn clean install 第二步:把任务jar包依赖的jar包全部导出来.使用mav ...
- Proxmox
vmware: vmware 12 pro proxmox 下载地址 往下会比较麻烦一点,这里就不做展示了(仅供参考)
- SQL Server里如何处理死锁 (转)
http://www.cnblogs.com/woodytu/p/6437049.html 在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以 ...
- idea 中提示:Warning:java: 源值1.5已过时, 将在未来所有发行版中删除
maven的配置文件settings.xml中添加: <profile> <id>jdk-1.8</id> <activation> <activ ...
- python django项目创建及前期准备(使用pycharm)
一.创建django项目 1.打开pycharm软件 2.点击菜单栏 File-->New Project,弹出如下对话框,如下图设置 二.基本配置 1.静态文件目录配置(用于客户端访问后台服务 ...
- TensorFlow实战第一课(session、Variable、Placeholder、Activation Function)
莫烦tensorflow教学 1.session会话控制 Tensorflow 中的Session, Session是 Tensorflow 为了控制,和输出文件的执行的语句. 运行session.r ...
- python笔记之python基础
python基础语法 1.变量命名规则 1).变量必须以字母或者下划线_开头 2).变量可由字母.数字.下划线_组成 3).变量对大小写敏感 2.多行语句 当编写的代码较长,需要换行,可使用 \ 进行 ...
- 利用微信web开发者工具调试企业微信页面
1.只有企业号的管理员才能调试. 2.勾选企业号的开发者工具(具体位置见下图,这个入口位置总是在变,一般来说,找到”微工作台“就能找到了) 3.下载web开发者工具 https://developer ...