【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) 程序,所以每个发给它的请求都会引起大量计算.本文将实现一个简单的社交网站,则会尽可能地减少用户在查看页面时系统所 ...
随机推荐
- python3.*之列表常用操作
首先定义一个列表:names= ["xiaoming","xiaogang","xiaomei","xiaohong"] ...
- nuros安全报告
We believe that great technology should benefit everyone. Self-driving vehicles promise to save live ...
- LC 465. Optimal Account Balancing 【lock,hard】
A group of friends went on holiday and sometimes lent each other money. For example, Alice paid for ...
- [shell]上一个命令执行完成,才执行下一个操作 | shell脚本中判断上一个命令是否执行成功
shell脚本中判断上一个命令是否执行成功 shell中使用符号“$?”来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败.结合if-else语句实现判断上一个命令是否执行成功. 场 ...
- 学习前端第二天心得体会(初步了解HTML5的部分API以及画布Canvas)
一.HTML5部分API 1.选择器querySelector和querySelectorAll 1.1.querySelector:返回文档中匹配指定的CSS选择器的第一元素. document. ...
- Sql UpdateOrInsert
SqlServer(先更新,受影响条数为0,则Insert,通过事务): begin tran update table set column=columnvalue where wherestr b ...
- JavaScript简易事件触发合集
1.<input id="billing" type="text" placeholder="123" onkeyup="t ...
- LoadRunner 技巧之协议分析
LoadRunner 技巧之协议分析 在做性能测试的时候,协议分析是困扰初学者的难题,选择错误的协议会导致Virtual User Generator 录制不到脚本:或录制的脚本不完整,有些应用可能需 ...
- Python核心编程练习题
1.输入一个数值,判断是否为正数,负数,小数,以及字符串 import re def is_number(num): pattern = re.compile(r'^[-+]?[-0-9]\d*\.\ ...
- DataTable.Select筛选过滤数据返回DataRow[]转为DataTable添加到DataSet
问题还原,如图所示,我们要筛选所有SHDP 为北京翠微KR的数据. 1. 筛选DataTable微软为我们提供了一个方法DataTable.Select(),其用法如下: 1) Select()—— ...