工作招聘网--Lucene(全文检索)实战

一.创建索引:

1.在前台页面添加一个"重建索引"按钮        

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>列表页面</title>
</head>
<body>
<div style="text-align: center;"><h1>职位信息</h1></div>
<table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tr>
		<td colspan="3" >
			<a href="<s:url action="jobApply_edit" />">添加</a></td>
		<td colspan="3" >
			<a href="<s:url action="jobApply_createIndex" />">创建索引</a></td>
		<td colspan="2" >
			<a href="<s:url action="jobApplySearch" />">查询</a></td>	
	</tr>
	<tr>
		<td width="10">ID</td>
		<td width="200">标题</td>
		<td width="400">内容</td>
		<td width="150">公司</td>
		<td width="100">公司类型</td>
		<td width="200">行业</td>
		<td width="120">工作地点</td>
		<td width="200">薪水范围</td>
		<td width="200">操作</td>
	</tr>
	<s:iterator value="jobApplys">
		<tr>
			<td><s:property value="id"/></td>
			<td><s:property value="title"/></td>
			<td><s:property value="content"/></td>
			<td><s:property value="company.name"/></td>
			<td><s:property value="company.companyType.name"/></td>
			<td><s:property value="trade.name"/></td>
			<td><s:property value="city.name"/></td>
			<td><s:property value="salaryLevel.name"/></td>
			<td>
				<a href="<s:url action="jobApply_edit"><s:param name="id" value="id"/></s:url>">修改</a>
				<a href="<s:url action="jobApply_delete"><s:param name="id" value="id"/></s:url>">删除</a>
			</td>
		</tr>
	</s:iterator>
</table>
</body>
</html>

2.点击"重建索引"后,调用后台方法

package cn.itsource.job.web.action;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import cn.itsource.job.domain.City;
import cn.itsource.job.domain.Company;
import cn.itsource.job.domain.JobApply;
import cn.itsource.job.domain.SalaryLevel;
import cn.itsource.job.domain.Trade;
import cn.itsource.job.service.ICityService;
import cn.itsource.job.service.ICompanyService;
import cn.itsource.job.service.IJobApplyService;
import cn.itsource.job.service.ISalaryLevelService;
import cn.itsource.job.service.ITradeService;

public class JobApplyAction  extends ActionSupport {
	private static final long serialVersionUID = 1L;
	private JobApply jobApply;
	private Long id;
	private List<JobApply> jobApplys;
	private List<Company> companys;
	private List<City> citys;
	private List<Trade> trades;
	private List<SalaryLevel> salayLevels;

	private IJobApplyService service;
	private ICityService cityService;
	private ITradeService tradeService;
	private ICompanyService companyService;
	private ISalaryLevelService salaryLevelService;
	/*************************和索引相关的***********************************/
	//创建索引createIndex
	public String createIndex() {
		//获取需要创建索引的数据库数据
		List<JobApply> listJobApplys =service.listJobApplys();
		System.out.println(listJobApplys.size());
		//使用查询创建索引
		service.createIndex(listJobApplys);
		return SUCCESS;
	}
	/*************************和索引相关的***********************************/
	public String view() {
		jobApply = service.getJobApply(id);
		return "view";
	}

	public String list() {
		this.jobApplys = this.service.listJobApplys();
		return "list";
	}
	
	public String edit() {
		citys = cityService.listCitys();
		trades = tradeService.listTrades();
		salayLevels = salaryLevelService.listSalaryLevels();
		companys = companyService.listCompanys();
		if (id != null)
			this.jobApply = this.service.getJobApply(id);
		return INPUT;
	}

	public String update() {
		if (this.jobApply.getId() != null)
			this.service.updateJobApply(jobApply);
		else
			this.service.saveJobApply(jobApply);
		return SUCCESS;
	}
	
	public String delete() {
		if (this.id != null) {
			this.service.deleteJobApply(id);
		}
		return SUCCESS;
	}

	public JobApply getJobApply() {
		return jobApply;
	}

	public void setJobApply(JobApply JobApply) {
		this.jobApply = JobApply;
	}

	public List<JobApply> getJobApplys() {
		return jobApplys;
	}

	public void setJobApplys(List<JobApply> JobApplys) {
		this.jobApplys = JobApplys;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public void setService(IJobApplyService service) {
		this.service = service;
	}

	public List<Company> getCompanys() {
		return companys;
	}

	public List<City> getCitys() {
		return citys;
	}

	public List<Trade> getTrades() {
		return trades;
	}

	public List<SalaryLevel> getSalayLevels() {
		return salayLevels;
	}

	public void setCityService(ICityService cityService) {
		this.cityService = cityService;
	}

	public void setTradeService(ITradeService tradeService) {
		this.tradeService = tradeService;
	}

	public void setCompanyService(ICompanyService companyService) {
		this.companyService = companyService;
	}

	public void setSalaryLevelService(ISalaryLevelService salaryLevelService) {
		this.salaryLevelService = salaryLevelService;
	}

}

3.把数据源封装为Document对象

3.1后台:查询需要创建索引的对象

3.2后台:遍历这些对象,封装成Document对象

3.1.1service层实现类(接口略)

4.创建索引写入器IndexWriter

5.后台:通过indexWriter把创建好的Document对象添加到索引库

package cn.itsource.job.service.impl;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.apache.lucene.search.Query;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import cn.itsource.job.dao.IJobApplyDAO;
import cn.itsource.job.domain.JobApply;
import cn.itsource.job.helper.JobApplyIndexHelper;
import cn.itsource.job.query.JobApplyQuery;
import cn.itsource.job.service.IJobApplyService;


@Transactional(propagation = Propagation.REQUIRED)
public  class JobApplyServiceImpl implements IJobApplyService {
	private IJobApplyDAO dao;
	
	public void setDao(IJobApplyDAO dao) {
		this.dao = dao;
	}

	@Override
	public void saveJobApply(JobApply d) {
		this.dao.save(d);
	}

	@Override
	public void updateJobApply(JobApply d) {
		this.dao.update(d);
	}

	@Override
	public void deleteJobApply(Serializable id) {
		this.dao.delete(id);
	}

	@Override
	@Transactional(readOnly = true)
	public JobApply getJobApply(Serializable id) {
		return this.dao.get(id);
	}

	@Override
	@Transactional(readOnly = true)
	public List<JobApply> listJobApplys() {
		return this.dao.list();
	}
	/************创建索引*************/
	@Override
	public void createIndex(List<JobApply> listJobApplys) {
		new JobApplyIndexHelper().createIndex(listJobApplys);
	}
	/************创建索引*************/
	@Override
	public List<Map<String, Object>> search(JobApplyQuery qo) {
		Query query = qo.getQuery();
		List<Map<String, Object>> result=new JobApplyIndexHelper().createSearch(query);
		return result;
	}
}

 

3.1.2代码实现(附 高亮.)

package cn.itsource.job.helper;
import java.io.IOException;
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.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
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 cn.itsource.job.domain.City;
import cn.itsource.job.domain.Company;
import cn.itsource.job.domain.JobApply;
import cn.itsource.job.domain.SalaryLevel;
import cn.itsource.job.domain.Trade;
import cn.itsource.job.util.LuceneUtil;
/**
 * jobApply 相关的索引都放这里
 * @author Administrator
 */
public class JobApplyIndexHelper {
	/**
	 * 创建索引
	 * @param listJobApplys
	 */
	private IndexWriter indexWriter=null;
	public void createIndex(List<JobApply> listJobApplys) {
		try {
				//1.获取数据源 List<JobApply> listJobApplys  已经完成
				//2.获取索引器
				indexWriter = LuceneUtil.INSTANCE.getIndexWriter();
				//3.吧数据转换为dicument提交到数据库
				//3.1创建之前清空
				indexWriter.deleteAll();
				indexWriter.commit();
				//3.2添加到缓冲区
				for (JobApply jobApply : listJobApplys) {
					Document doc = getDocument(jobApply);
					indexWriter.addDocument(doc);
				}
				indexWriter.commit();
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
	
	//3.吧数据转换为document提交到数据库
	@SuppressWarnings("null")
	private Document getDocument(JobApply jobApply) {
		Document doc=new Document();
		doc.add(new StringField("id", jobApply.getId().toString(), Store.YES));
		//TextField需要分词
		doc.add(new TextField("title", jobApply.getTitle().toString(), Store.YES));
		doc.add(new StringField("content", jobApply.getContent().toString(), Store.YES));
		Company company = jobApply.getCompany();
		if (company!=null) {
			doc.add(new StringField("company",company.getName(), Store.YES));
		}
		City city = jobApply.getCity();
		if (city!=null) {
			doc.add(new StringField("city",city.getName(), Store.YES));
		}
		SalaryLevel salaryLevel=jobApply.getSalaryLevel();
		if (salaryLevel==null) {
			doc.add(new StringField("salaryLevel", jobApply.getSalaryLevel().toString(), Store.YES));
		}
		Trade trade = jobApply.getTrade();
		if (trade==null) {
			doc.add(new StringField("trade", trade.getName(), Store.YES));
		}
		return doc;
	}
	/**
	 * 做高亮处理:
	 * 1.先得到高亮器
	 * 2.对结果进行高亮处理
	 */
	public List<Map<String, Object>> createSearch(Query query) {
		List<Map<String, Object>>  result=new ArrayList<>();
		try {
			//1/将查询条件封装为Query对象
			//2.创建查询器
			IndexSearcher indexSearcher=LuceneUtil.INSTANCE.getIndexSearcher();
			//3.做查询
			TopDocs docs = indexSearcher.search(query, 100000);
			
			//设置前缀+后缀
			Formatter formatter=new SimpleHTMLFormatter("<font style='color:red'>","</font>");
			//记录器
			Scorer fragmentScorer=new QueryScorer(query);
			Highlighter highlighter = new Highlighter(formatter, fragmentScorer);
			//设置高亮器的属性
			Fragmenter fragmenter=new SimpleFragmenter(50);//截取的字段长度
			highlighter.setTextFragmenter(fragmenter);
			System.out.println("3333333333333"+highlighter);
			//4.封装结果
			ScoreDoc[] docs2 = docs.scoreDocs;
			for (ScoreDoc scoreDoc : docs2) {
				int docID = scoreDoc.doc;
				Document doc = indexSearcher.doc(docID);
				System.out.println(docID+"="+doc);
				//把文档对象转换为Map
				result.add(result2map(doc,highlighter));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
	}

	private Map<String, Object> result2map(Document doc, Highlighter highlighter) {
		Map<String, Object> map=new HashMap<>();
		map.put("id", doc.get("id"));
		try {
			String title = doc.get("title");
			//对Title和Content进行高亮处理
			String titleTmp = highlighter.getBestFragment(LuceneUtil.INSTANCE.getAnalyzer(), "title", title);
			if (null == titleTmp) {
				System.out.println("555555"+titleTmp);
				titleTmp = title;
			}
			
			String content = doc.get("content");
			/*String contentTmp = highlighter.getBestFragment(LuceneUtil.INSTANCE.getAnalyzer(), "content", content);
			if (null == contentTmp) {
				contentTmp = content;
			}
			*/
			map.put("title", title);
			map.put("content", content);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		map.put("company", doc.get("company"));
		map.put("city", doc.get("city"));
		return map;
	}
	
	
}		

工具类实现:

package cn.itsource.job.util;

import java.io.IOException;
import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer;

/**
 * 抽取索引的操作
 * @author Administrator
 *
 */
public enum LuceneUtil {
	INSTANCE;
	//通过lisener获取真实路径
	private  String indexPath=Global.webAppPath+"index";
	
	private IndexWriter indexWriter;
	
	private Analyzer analyzer;
	/**
	 * 获取索引器
	 */
	public IndexWriter getIndexWriter(){
		try {
			if (indexWriter==null) {
				synchronized (INSTANCE) {
					if (indexWriter==null) {
						if (analyzer==null) {
							analyzer=new IKAnalyzer();
						}
						IndexWriterConfig conf = new IndexWriterConfig(analyzer);
						Directory  directory = FSDirectory.open(Paths.get(indexPath));
						//1.创建索引器 需要两个条件    directory(目录)  IndexWriterConfig(配置信息)
						indexWriter=new IndexWriter(directory, conf);
					}
				}
			}
		} catch (IOException e) {
				e.printStackTrace();
		}
		return indexWriter;
	}
	public Analyzer getAnalyzer() {
		if (analyzer==null) {
			analyzer=new IKAnalyzer();
		}
		return analyzer;
	}
	public IndexSearcher getIndexSearcher() {
		try {
			IndexReader indexReader=DirectoryReader.open(FSDirectory.open(Paths.get(indexPath)));
			IndexSearcher searcher = new IndexSearcher(indexReader);
			return searcher;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
}


二.搜索索引

1.创建搜索页面,并且提供"搜索"按钮

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<script type="text/javascript">
	function goPage(page) {
		document.getElementById("currentPage").value = page;//
		document.forms[0].submit();
	}
	function selectChanged() {
		document.getElementById("currentPage").value = 1;
	}
</script>
</head>
<body>
	<s:form action="jobApplySearch_search">
		<s:hidden name="qo.currentPage" value="%{qo.currentPage}"
			id="currentPage" />
		<s:textfield name="qo.keyWords" value="%{qo.keyWords}" label="关键字" />
		<s:select name="qo.city" list="citys" label="工作城市" listKey="name"
			listValue="name" headerKey="-1" headerValue="-----"
			οnchange="selectChanged();" />
		<s:select name="qo.trade" list="trades" label="工作行业" listKey="name"
			listValue="name" headerKey="-1" headerValue="-----"
			οnchange="selectChanged();" />
		<s:select name="qo.salayLevel" list="salayLevels" label="薪水级别"
			listKey="name" listValue="name" headerKey="-1" headerValue="-----"
			οnchange="selectChanged();" />
		<s:select name="qo.company" list="companys" label="公司名称"
			listKey="name" listValue="name" headerKey="-1" headerValue="-----"
			οnchange="selectChanged();" />
		<s:submit value="提交" />
	</s:form>
	<hr size='5' color='gray' />
	
	<!-- 修改页面 -->
	<s:iterator value="results">
	<!--一条数据就是一个div  -->
		<div style="margin-bottom: 10px">
			<!-- 展示标题 --><!--escapeHtml="false"   不识别html ,取值为false则为识别 -->
			<div><a href="#"><s:property value="title" escapeHtml="false"/></a></div>
			<!--展示公司名称+城市  -->
			<div style="margin: 5px 0;color: gray;"><s:property value="company"/>-<s:property value="city"/></div>
			<!-- 展示内容 -->
			<div><s:property value="content"/>---------------- </div>
		</div>
	</s:iterator>
</body>
</html>

2.点击"搜索"后,提交搜索参数

package cn.itsource.job.web.action;

import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionSupport;

import cn.itsource.job.domain.City;
import cn.itsource.job.domain.Company;
import cn.itsource.job.domain.JobApply;
import cn.itsource.job.domain.SalaryLevel;
import cn.itsource.job.domain.Trade;
import cn.itsource.job.query.JobApplyQuery;
import cn.itsource.job.service.ICityService;
import cn.itsource.job.service.ICompanyService;
import cn.itsource.job.service.IJobApplyService;
import cn.itsource.job.service.ISalaryLevelService;
import cn.itsource.job.service.ITradeService;

public class JobApplySearchAction extends ActionSupport{
	
	private List<JobApply> jobApplys;
	private List<Company> companys;
	private List<City> citys;
	private List<Trade> trades;
	private List<SalaryLevel> salayLevels;

	private IJobApplyService service;
	private ICityService cityService;
	private ITradeService tradeService;
	private ICompanyService companyService;
	private ISalaryLevelService salaryLevelService;
	//查询条件
	private JobApplyQuery qo;
	
	private List<Map<String, Object>> results=null;
	
	//jobApplySearch
	//将数据展示到前台
	@Override
	public String execute() throws Exception {
		citys= cityService.listCitys();
		trades = tradeService.listTrades();
		companys = companyService.listCompanys();
		salayLevels = salaryLevelService.listSalaryLevels();
		return SUCCESS;
	}
	
	//查询页面   要带查询结果
	public String search() throws Exception {
		citys= cityService.listCitys();
		trades = tradeService.listTrades();
		companys = companyService.listCompanys();
		salayLevels = salaryLevelService.listSalaryLevels();
		//查询
		results=service.search(qo);
		return SUCCESS;
	}
	
	
	
	
	public List<Map<String, Object>> getResults() {
		return results;
	}

	public void setResults(List<Map<String, Object>> results) {
		this.results = results;
	}

	public JobApplyQuery getQo() {
		return qo;
	}

	public void setQo(JobApplyQuery qo) {
		this.qo = qo;
	}

	public List<JobApply> getJobApplys() {
		return jobApplys;
	}
	public void setJobApplys(List<JobApply> jobApplys) {
		this.jobApplys = jobApplys;
	}
	public List<Company> getCompanys() {
		return companys;
	}
	public void setCompanys(List<Company> companys) {
		this.companys = companys;
	}
	public List<City> getCitys() {
		return citys;
	}
	public void setCitys(List<City> citys) {
		this.citys = citys;
	}
	public List<Trade> getTrades() {
		return trades;
	}
	public void setTrades(List<Trade> trades) {
		this.trades = trades;
	}
	public List<SalaryLevel> getSalayLevels() {
		return salayLevels;
	}
	public void setSalayLevels(List<SalaryLevel> salayLevels) {
		this.salayLevels = salayLevels;
	}
	public IJobApplyService getService() {
		return service;
	}
	public void setService(IJobApplyService service) {
		this.service = service;
	}
	public ICityService getCityService() {
		return cityService;
	}
	public void setCityService(ICityService cityService) {
		this.cityService = cityService;
	}
	public ITradeService getTradeService() {
		return tradeService;
	}
	public void setTradeService(ITradeService tradeService) {
		this.tradeService = tradeService;
	}
	public ICompanyService getCompanyService() {
		return companyService;
	}
	public void setCompanyService(ICompanyService companyService) {
		this.companyService = companyService;
	}
	public ISalaryLevelService getSalaryLevelService() {
		return salaryLevelService;
	}
	public void setSalaryLevelService(ISalaryLevelService salaryLevelService) {
		this.salaryLevelService = salaryLevelService;
	}
	
	
}
	3.后台,接收查询条件,封装到查询对象(javabean)

4.后台,把查询条件传入"service"完成查询



/************查询*************/
	@Override
	public List<Map<String, Object>> search(JobApplyQuery qo) {
		Query query = qo.getQuery();
		List<Map<String, Object>> result=new JobApplyIndexHelper().createSearch(query);
		return result;
	}
	/************查询*************/

4.1.使用"查询对象"产出Lucene的Query对象

4.2.使用Query完成Lucene索引库的查询

5.后台,吧结果封装,返回

package cn.itsource.job.helper;
import java.io.IOException;
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.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
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 cn.itsource.job.domain.City;
import cn.itsource.job.domain.Company;
import cn.itsource.job.domain.JobApply;
import cn.itsource.job.domain.SalaryLevel;
import cn.itsource.job.domain.Trade;
import cn.itsource.job.util.LuceneUtil;
/**
 * jobApply 相关的索引都放这里
 * @author Administrator
 */
public class JobApplyIndexHelper {
	/**
	 * 创建索引
	 * @param listJobApplys
	 */
	private IndexWriter indexWriter=null;
	public void createIndex(List<JobApply> listJobApplys) {
		try {
				//1.获取数据源 List<JobApply> listJobApplys  已经完成
				//2.获取索引器
				indexWriter = LuceneUtil.INSTANCE.getIndexWriter();
				//3.吧数据转换为dicument提交到数据库
				//3.1创建之前清空
				indexWriter.deleteAll();
				indexWriter.commit();
				//3.2添加到缓冲区
				for (JobApply jobApply : listJobApplys) {
					Document doc = getDocument(jobApply);
					indexWriter.addDocument(doc);
				}
				indexWriter.commit();
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
	
	//3.吧数据转换为document提交到数据库
	@SuppressWarnings("null")
	private Document getDocument(JobApply jobApply) {
		Document doc=new Document();
		doc.add(new StringField("id", jobApply.getId().toString(), Store.YES));
		//TextField需要分词
		doc.add(new TextField("title", jobApply.getTitle().toString(), Store.YES));
		doc.add(new StringField("content", jobApply.getContent().toString(), Store.YES));
		Company company = jobApply.getCompany();
		if (company!=null) {
			doc.add(new StringField("company",company.getName(), Store.YES));
		}
		City city = jobApply.getCity();
		if (city!=null) {
			doc.add(new StringField("city",city.getName(), Store.YES));
		}
		SalaryLevel salaryLevel=jobApply.getSalaryLevel();
		if (salaryLevel==null) {
			doc.add(new StringField("salaryLevel", jobApply.getSalaryLevel().toString(), Store.YES));
		}
		Trade trade = jobApply.getTrade();
		if (trade==null) {
			doc.add(new StringField("trade", trade.getName(), Store.YES));
		}
		return doc;
	}
	/**
	 * 做高亮处理:
	 * 1.先得到高亮器
	 * 2.对结果进行高亮处理
	 */
	public List<Map<String, Object>> createSearch(Query query) {
		List<Map<String, Object>>  result=new ArrayList<>();
		try {
			//1/将查询条件封装为Query对象
			//2.创建查询器
			IndexSearcher indexSearcher=LuceneUtil.INSTANCE.getIndexSearcher();
			//3.做查询
			TopDocs docs = indexSearcher.search(query, 100000);
			
			//设置前缀+后缀
			Formatter formatter=new SimpleHTMLFormatter("<font style='color:red'>","</font>");
			//记录器
			Scorer fragmentScorer=new QueryScorer(query);
			Highlighter highlighter = new Highlighter(formatter, fragmentScorer);
			//设置高亮器的属性
			Fragmenter fragmenter=new SimpleFragmenter(50);//截取的字段长度
			highlighter.setTextFragmenter(fragmenter);
			System.out.println("3333333333333"+highlighter);
			//4.封装结果
			ScoreDoc[] docs2 = docs.scoreDocs;
			for (ScoreDoc scoreDoc : docs2) {
				int docID = scoreDoc.doc;
				Document doc = indexSearcher.doc(docID);
				System.out.println(docID+"="+doc);
				//把文档对象转换为Map
				result.add(result2map(doc,highlighter));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
	}

	private Map<String, Object> result2map(Document doc, Highlighter highlighter) {
		Map<String, Object> map=new HashMap<>();
		map.put("id", doc.get("id"));
		try {
			String title = doc.get("title");
			//对Title和Content进行高亮处理
			String titleTmp = highlighter.getBestFragment(LuceneUtil.INSTANCE.getAnalyzer(), "title", title);
			if (null == titleTmp) {
				System.out.println("555555"+titleTmp);
				titleTmp = title;
			}
			
			String content = doc.get("content");
			/*String contentTmp = highlighter.getBestFragment(LuceneUtil.INSTANCE.getAnalyzer(), "content", content);
			if (null == contentTmp) {
				contentTmp = content;
			}
			*/
			map.put("title", title);
			map.put("content", content);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		map.put("company", doc.get("company"));
		map.put("city", doc.get("city"));
		return map;
	}
	
	
}

三.高亮处理

1.导包:

lucene-highlighter-5.5.0.jar

lucene-memory-5.5.0.jar

2.创建高亮器

源码地址:http://download.csdn.net/detail/gs932899178/9719072

------------------------------------------------------------附文件原版--------------------------------------------



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值