亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Hibernate Search使用以及搜索結果高亮顯示

2019-11-10 18:54:25
字體:
來源:轉載
供稿:網友

Hibernate Search使用以及搜索結果高亮顯視

1、首先說一下需求

有兩個實體:問題實體(Question)和選項實體(QuestionOption),兩個實體間是一對多關系,需求如下:根據問題(questionContent字段)或選項(questionOptionContent字段)進行搜索,并將搜索結果高亮顯示。

2、所需jar包(gradle項目)

'org.hibernate:hibernate-core:5.0.9.Final','org.hibernate:hibernate-java8:5.0.9.Final','org.hibernate:hibernate-ehcache:5.0.9.Final','org.hibernate:hibernate-entitymanager:5.0.9.Final','org.hibernate:hibernate-search-engine:5.5.4.Final','org.hibernate:hibernate-search-orm:5.5.4.Final','org.apache.lucene:lucene-core:5.3.1','org.apache.lucene:lucene-analyzers-smartcn:5.3.1','org.apache.lucene:lucene-highlighter:5.3.1'

3、實體注解如下(具體參照hibernate search 官網):

import java.util.HashSet;import java.util.Set;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import static javax.persistence.GenerationType.IDENTITY;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.ManyToMany;import javax.persistence.OneToMany;import javax.persistence.Table;import javax.persistence.UniqueConstraint;import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;import org.hibernate.search.annotations.Analyze;import org.hibernate.search.annotations.Analyzer;import org.hibernate.search.annotations.Field;import org.hibernate.search.annotations.Index;import org.hibernate.search.annotations.Indexed;import org.hibernate.search.annotations.IndexedEmbedded;import org.hibernate.search.annotations.Store;/** * Question generated by hbm2java * updated by 馬輝 2016-11-29 21:46 */@Indexed@Entity@Table(name = "question", catalog = "mryt", uniqueConstraints = @UniqueConstraint(columnNames = "question_sn"))@Analyzer(impl=SmartChineseAnalyzer.class)//分詞器public class Question implements java.io.Serializable {	PRivate static final long serialVersionUID = 4651161939667149753L;	private Integer id;	private String questionSn;	private String questionContent;	private Set<QuestionOption> questionOptions = new HashSet<QuestionOption>(0);	@Id	@GeneratedValue(strategy = IDENTITY)	@Column(name = "id", unique = true, nullable = false)	public Integer getId() {		return this.id;	}	public void setId(Integer id) {		this.id = id;	}	@Column(name = "question_sn", unique = true, length = 50)	public String getQuestionSn() {		return this.questionSn;	}	public void setQuestionSn(String questionSn) {		this.questionSn = questionSn;	}	@Field(index=Index.YES, analyze=Analyze.YES, store=Store.YES)	@Column(name = "questionContent", length = 65535)	public String getQuestionContent() {		return this.questionContent;	}	public void setQuestionContent(String questionContent) {		this.questionContent = questionContent;	}	@IndexedEmbedded	@OneToMany(targetEntity=QuestionOption.class, fetch = FetchType.LAZY, mappedBy = "question")	public Set<QuestionOption> getQuestionOptions() {		return this.questionOptions;	}	public void setQuestionOptions(Set<QuestionOption> questionOptions) {		this.questionOptions = questionOptions;	}}
import java.util.HashSet;import java.util.Set;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.OneToMany;import javax.persistence.Table;import javax.persistence.UniqueConstraint;import org.hibernate.search.annotations.Analyze;import org.hibernate.search.annotations.Field;import org.hibernate.search.annotations.Index;import org.hibernate.search.annotations.Indexed;import org.hibernate.search.annotations.Store;/** * QuestionOption generated by hbm2java * updated by 馬輝 2016-11-29 21:48 */@Indexed@Entity@Table(name = "question_option", catalog = "mryt", uniqueConstraints = @UniqueConstraint(columnNames = "question_option_sn"))public class QuestionOption implements java.io.Serializable {	private static final long serialVersionUID = 3055805431841974260L;	private int id;	private Question question;	private String questionOptionSn;	private String questionOptionContent;	private boolean isAnswer;	private Set<EmployeeQuestionOption> employeeQuestionOptions = new HashSet<EmployeeQuestionOption>(0);	@Id	@Column(name = "id", unique = true, nullable = false)	public int getId() {		return this.id;	}	public void setId(int id) {		this.id = id;	}	@ManyToOne(targetEntity=Question.class,fetch = FetchType.LAZY)	@JoinColumn(name = "question_sn",referencedColumnName="question_sn", nullable = false)	public Question getQuestion() {		return this.question;	}	public void setQuestion(Question question) {		this.question = question;	}	@Column(name = "question_option_sn", unique = true, nullable = false, length = 60)	public String getQuestionOptionSn() {		return this.questionOptionSn;	}	public void setQuestionOptionSn(String questionOptionSn) {		this.questionOptionSn = questionOptionSn;	}	@Field(index=Index.YES, analyze=Analyze.YES, store=Store.YES)	@Column(name = "question_option_content", nullable = false, length = 65535)	public String getQuestionOptionContent() {		return this.questionOptionContent;	}	public void setQuestionOptionContent(String questionOptionContent) {		this.questionOptionContent = questionOptionContent;	}	@Column(name = "is_answer", nullable = false)	public boolean getIsAnswer() {		return isAnswer;	}	public void setIsAnswer(boolean isAnswer) {		this.isAnswer = isAnswer;	}	@OneToMany(targetEntity=EmployeeQuestionOption.class, fetch = FetchType.LAZY, mappedBy = "questionOption")	public Set<EmployeeQuestionOption> getEmployeeQuestionOptions() {		return this.employeeQuestionOptions;	}	public void setEmployeeQuestionOptions(Set<EmployeeQuestionOption> employeeQuestionOptions) {		this.employeeQuestionOptions = employeeQuestionOptions;	}}

4、搜索以及高亮 

/**	 * @method 私有方法(打包高亮問題json)	 * @param question	 * @author mahui	 * @return JSONObject	 */	private JSONObject packSearchQuestion(Question question,Query luceneQuery,String str){  		SimpleHTMLFormatter formatter = new SimpleHTMLFormatter( "<span style='color:red;'>", "</span>");        	QueryScorer qs = new QueryScorer(luceneQuery);          	Highlighter highlighter = new Highlighter( formatter, qs);         	Analyzer analyzer = new SmartChineseAnalyzer();        		JSONObject jsonObject=new JSONObject();				JSONObject qjo=new JSONObject();		qjo.put("questionSn", question.getQuestionSn());		//存放高亮問題		String questionContent="";		try {          		questionContent = highlighter.getBestFragment(analyzer, str, question.getQuestionContent());         	} catch (InvalidTokenOffsetsException e) {              		e.printStackTrace();          	} catch (IOException e) {			e.printStackTrace();		}          	//重新封裝問題          	if(questionContent!=null&&questionContent.trim().length()>0){        		qjo.put("questionContent", questionContent);        	}else{        		qjo.put("questionContent", question.getQuestionContent());        	}				JSONArray array=new JSONArray();		int i=0;		//選項高亮		for(QuestionOption questionOption:question.getQuestionOptions()){			JSONObject jo=new JSONObject();			jo.put("order", (char)('A'+i));			jo.put("optionSn", questionOption.getQuestionOptionSn());							//存放高亮選項			String optionContent="";			try {  				optionContent = highlighter.getBestFragment(analyzer, str, questionOption.getQuestionOptionContent()); 		        } catch (InvalidTokenOffsetsException e) {  		            	e.printStackTrace();  		        } catch (IOException e) {				e.printStackTrace();			}  		        //重新封裝選項 		        if(optionContent!=null&&optionContent.trim().length()>0){		        	jo.put("optionContent", optionContent);		        }else{		        	jo.put("optionContent", questionOption.getQuestionOptionContent());		        }				jo.put("isAnswer", questionOption.getIsAnswer());				array.add(jo);				i++;			}		jsonObject.put("question", qjo);		jsonObject.put("options", array);		return jsonObject;	}		/**	 * @method 全文檢索問題	 * @param str	 * @author mahui	 * @return JSONArray	 */	@SuppressWarnings("unchecked")	@Override	public JSONArray fullTextQuery(String str) {		FullTextsession fullTextSession = Search.getFullTextSession(getSession());		List<Question> list=new ArrayList<Question>();		try {			fullTextSession.createIndexer().startAndWait();		} catch (InterruptedException e) {			// TODO Auto-generated catch block			e.printStackTrace();		}		QueryBuilder qb=fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Question.class).get();		org.apache.lucene.search.Query luceneQuery = qb				  .keyWord()				  .onFields("questionContent", "questionOptions.questionOptionContent")				  .matching(str)				  .createQuery();		FullTextQuery query = fullTextSession.createFullTextQuery(luceneQuery, Question.class);		list=query.setMaxResults(2).list();		JSONArray array=new JSONArray();		for(Question question:list){			array.add(packSearchQuestion(question,luceneQuery,str));		}               		return array;	}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品精品久久久| 日韩高清免费在线| 一本一本久久a久久精品牛牛影视| 日韩在线观看免费av| 久久免费成人精品视频| 18久久久久久| 亚洲第一福利网| 在线视频中文亚洲| 91国内免费在线视频| 成人444kkkk在线观看| 色偷偷91综合久久噜噜| 不卡在线观看电视剧完整版| 丰满岳妇乱一区二区三区| 久久久人成影片一区二区三区观看| 亚洲丝袜一区在线| 国产精品自拍偷拍| 日韩风俗一区 二区| 亚洲精品中文字幕女同| 69久久夜色精品国产69| 亚洲男人天堂网站| 国产精品久久久久久久久久小说| 97国产suv精品一区二区62| 欧洲亚洲免费视频| 日韩国产在线播放| 色777狠狠综合秋免鲁丝| 国产精品扒开腿做爽爽爽男男| 国产精品爽爽ⅴa在线观看| 欧美日韩一区二区三区在线免费观看| 日韩有码在线播放| 精品久久久久久中文字幕一区奶水| 国产日产久久高清欧美一区| 亚洲欧美国产精品| 国产91在线视频| 日韩av在线免费| 成人中文字幕+乱码+中文字幕| 91视频国产一区| 欧美激情2020午夜免费观看| 久久成人人人人精品欧| 欧美性xxxx极品hd欧美风情| 在线一区二区日韩| 亚洲日本欧美中文幕| 欧美激情一区二区三区在线视频观看| 亚洲国产精久久久久久| 91wwwcom在线观看| 久久精品99国产精品酒店日本| 亚洲精品福利视频| 精品视频久久久久久| 国产精品视频精品视频| 国产福利精品视频| 成人免费在线视频网站| 欧美性色xo影院| 亚洲国产精品va在线看黑人| 国产欧美日韩91| 欧美日韩国产成人高清视频| 亚洲人成啪啪网站| 欧美日韩国产综合新一区| 国产精品久久久久久av福利软件| 久久久久久久亚洲精品| 欧美人在线观看| 欧美日韩在线免费观看| 亚洲精品在线看| 亚洲第一精品自拍| 国产精品av免费在线观看| 国产一区二区香蕉| 国产精品美女主播| 亚洲精品永久免费| 米奇精品一区二区三区在线观看| 在线观看欧美日韩国产| 亚洲一区二区三区在线免费观看| 国产不卡精品视男人的天堂| 黄色成人av网| 日韩欧美极品在线观看| 国产精品视频久久久久| 26uuu另类亚洲欧美日本一| 精品国产欧美一区二区三区成人| 日韩综合视频在线观看| 国产精品久久久久91| 亚洲精品国产福利| 久久91精品国产91久久久| 亚洲男女性事视频| 91国自产精品中文字幕亚洲| 全色精品综合影院| 欧美日韩不卡合集视频| 亚洲精品国产精品国自产观看浪潮| 久久精品这里热有精品| 全亚洲最色的网站在线观看| 精品一区二区电影| 久久伊人精品一区二区三区| 精品国产一区二区三区久久久狼| 亚洲xxxx视频| 精品国产鲁一鲁一区二区张丽| 色视频www在线播放国产成人| 日韩电影免费观看在线观看| 欧美性猛交xxxx乱大交蜜桃| 91热福利电影| 亚洲福利视频久久| 亚洲社区在线观看| 国产脚交av在线一区二区| 久久久久久久999| 在线观看日韩av| 一级做a爰片久久毛片美女图片| 国产精品高潮视频| 97超级碰碰碰久久久| 97在线看免费观看视频在线观看| 日韩中文字幕久久| 日韩精品免费在线播放| 一本色道久久88精品综合| 久久夜色精品亚洲噜噜国产mv| 久久久成人的性感天堂| 精品毛片网大全| 国产成人av在线| 日韩av男人的天堂| 91亚洲国产成人精品性色| 久久精品99无色码中文字幕| 亚洲精品一区二区网址| 国产精品三级美女白浆呻吟| 久久青草精品视频免费观看| 日韩精品极品视频免费观看| 日本精品一区二区三区在线播放视频| 综合久久五月天| 成人激情视频免费在线| 最近2019中文字幕第三页视频| 8090理伦午夜在线电影| 黑人巨大精品欧美一区二区一视频| 国产91色在线|免| 国产成人97精品免费看片| 欧美黑人狂野猛交老妇| 欧美人成在线视频| 亚洲视频国产视频| 欧美日本国产在线| 2019国产精品自在线拍国产不卡| 日韩欧美主播在线| 亚洲国产精品电影| 国产一区视频在线播放| 国产精品久久综合av爱欲tv| 亚洲天堂久久av| 欧美视频裸体精品| 777777777亚洲妇女| 午夜精品久久久久久久男人的天堂| 国产亚洲精品久久久久动| 亚洲国产一区二区三区在线观看| 日本欧美国产在线| 欧美日韩激情视频| 亚洲精品美女免费| 免费av一区二区| 亚洲男人av电影| 国产精品午夜国产小视频| 夜色77av精品影院| 国产精品欧美亚洲777777| 国产日韩欧美在线看| 欧美色图在线视频| 国产美女久久精品| 亚洲欧美另类在线观看| 亚洲一区二区三区四区在线播放| 亚洲欧美精品一区二区| 亚洲免费中文字幕| 亚洲精品动漫久久久久| 最近日韩中文字幕中文| 伦理中文字幕亚洲| 国产精品美女视频网站| 91夜夜揉人人捏人人添红杏| 国产自产女人91一区在线观看| 欧美日韩国产中文字幕| 欧美日韩国产精品专区|