【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) 程序,所以每个发给它的请求都会引起大量计算.本文将实现一个简单的社交网站,则会尽可能地减少用户在查看页面时系统所 ...
随机推荐
- 如何使用Navicat监控mysql数据库服务器
https://jingyan.baidu.com/article/c33e3f48de5208ea15cbb525.html 打开Navicat 点击[工具]菜单,选择[服务器监控]下的[MyS ...
- umount 报错was not found in /proc/mounts
前段时间在整理服务器时,看到nfs都是通过公网调用的,但是实际这几台服务器都是可以内网互通的,为了更稳定的使用,打算把这些挂载都更改为通过内网ip挂载,什么都设置好之后,操作第一台服务器没有问题,um ...
- OGG-00446 分析与解决
OGG-00446 分析与解决 Table of Contents 1. 00446 1.1. Missing filename opening checkpoint file 1.1.1. 错误信息 ...
- 使用ViewFlipper实现广告图片的自动轮播的效果
轮播资源图片的实现 package com.loaderman.viewflipperdemo; import android.os.Bundle; import android.support.v7 ...
- 依赖注入框架之butterknife
主页: https://github.com/JakeWharton/butterknife 用途: 主要用来简化各种初始化控件的操作 配置: 1. 在app/build.gradle文件中depen ...
- Extjs4 修改combox中store的数据
{ xtype: "combo", fieldLabel: '选择模板', name: "TemplateType", fieldName: "Tem ...
- 关于docker安装、docker镜像、docker容器等
1.Ubuntu安装docker sudo apt install docker.io 注意以下命令需在root下进行 sudo -s 2.查看docker当前容器 docker ps -a 3.启动 ...
- ubuntu下wps的安装
(一)安装 1)下载:WPS For Linux http://community.wps.cn/download/ 下载wps-office_10.1.0.5672~a21_amd64.deb 2) ...
- shaderToy学习篇
觉得shadertoy上的一些网友的作品写得很好,加上自己对glsl一些内置函数,内置变量不是很熟悉,于是决定开始学习一下上面一些大佬的代码. 今天的案例是这个: 附上shaderToy的地址:htt ...
- Centos磁盘空间不足,找不到占用文件
服务器报警,系统"/"空间不足,但找不到哪些文件占用. 1.使用du -sh *,层层目录查看依然找不到 2.使用"lsof / | grep -i delete&quo ...