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】一个简单的招聘网站的建立的更多相关文章

  1. php实现一个简单的购物网站

    实现一个简单的购物网站 一.考试时间:8小时 二.开发工具:DW 三.数据库:见附件 四.需要实现的页面: Index:浏览商品页面,显示商品列表,用户可以点击“购买“. ViewCart:查看购物车 ...

  2. [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)

    一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...

  3. Ruby学习笔记2 : 一个简单的Ruby网站,搭建ruby环境

    Ruby on Rails website 的基础是 请求-返回 循环. 首先是浏览器请求服务器, 第二步,Second, in our Rails application, the route ta ...

  4. 3.2 Lucene实战:一个简单的小程序

    在讲解Lucene索引和检索的原理之前,我们先来实战Lucene:一个简单的小程序! 一.索引小程序 首先,new一个java project,名字叫做LuceneIndex. 然后,在project ...

  5. Django 学习笔记之六 建立一个简单的博客应用程序

    最近在学习django时建立了一个简单的博客应用程序,现在把简单的步骤说一下.本人的用的版本是python 2.7.3和django 1.10.3,Windows10系统 1.首先通过命令建立项目和a ...

  6. django 建立一个简单的应用

    本人的用的版本是python 2.7.3和django 1.10.5,Windows10系统 1.首先通过命令建立项目和app 找到django的安装路径,我的路径是:C:\Python27\Lib\ ...

  7. 【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement

    本blog提供了一个简单的通过JDBC驱动建立JDBC连接例程.并分别通过Statement和PreparedStatement实现对数据库的查询. 在下一篇blog中将重点比較Statement与P ...

  8. quartz---的一个简单例子

    quartz---的一个简单例子 首先建立一个maven项目.jar工程即可.(提示:我前面有如何建立一个maven工程的总结以及maven环境的配置.) 1.建立好后点击到app中运行,--> ...

  9. Redis 实战 —— 11. 实现简单的社交网站

    简介 前面介绍了广告定向的实现,它是一个查询密集型 (query-intensive) 程序,所以每个发给它的请求都会引起大量计算.本文将实现一个简单的社交网站,则会尽可能地减少用户在查看页面时系统所 ...

随机推荐

  1. js 处理url参数,应用导航分类

    1.先上图 2.代码 html <li><a href="javascript:void(0);" data-cid = "{$v['id']}&quo ...

  2. Mui 底部导航切换

    1.建好子模板目录 2.导航代码 <nav class="mui-bar mui-bar-tab"> <a id="defaultTab" c ...

  3. Break 和 Continue 标签 kotlin(12)

    Break 和 Continue 标签 在 Kotlin 中任何表达式都可以用标签(label ) 来标记. 标签的格式为标识符后跟 @ 符 号,例如: abc@ . fooBar@ 都是有效的标签( ...

  4. ccf 201512-3 画图(90)

    ccf 201512-3 画图(90) #include<iostream> #include<cstring> #include<algorithm> using ...

  5. ROC和AUC————摘在网络

    ROC曲线 对于0,1两类分类问题,一些分类器得到的结果往往不是0,1这样的标签,如神经网络,得到诸如0.5,0,8这样的分类结果.这时,我们人为取一个阈值,比如0.4,那么小于0.4的为0类,大于等 ...

  6. distinct 与group by 去重

    mysql中常用去重复数据的方法是使用 distinct  或者group by ,以上2种均能实现,但2者也有不同的地方. distinct 特点: 如:select  distinct   nam ...

  7. 五十三:WTForms表单验证之常用验证器

    Email:验证数据是否为邮箱EqualTo:验证此字段的数据是否和另一个字段的值相等,常用与校验密码和确认密码InputRequired:检验数据必传Length:校验数据长度NumberRange ...

  8. kvm网络虚拟化(vlan,bond,vlan+bond)(3)

    一.Linux Bridge网桥管理 网络虚拟化是虚拟化技术中最复杂的部分,也是非常重要的资源. VM2 的虚拟网卡 vnet1 也连接到了 br0 上. 现在 VM1 和 VM2 之间可以通信,同时 ...

  9. 有效使用Django的QuerySets

    对象关系映射 (ORM) 使得与SQL数据库交互更为简单,不过也被认为效率不高,比原始的SQL要慢. 要有效的使用ORM,意味着需要多少要明白它是如何查询数据库的.本文我将重点介绍如何有效使用 Dja ...

  10. strip使用

    strip作用:去掉空格.以及想要去掉的字符,实例如下: In [42]: import subprocess In [42]: output=subprocess.check_output([&qu ...