`
BestUpon
  • 浏览: 290687 次
  • 性别: Icon_minigender_1
  • 来自: 兰州
社区版块
存档分类
最新评论

compass 实现非单POJO对象搜索应用

阅读更多

做的一个项目要求有搜索功能,就是用了compass做搜索,但是由于业务的特殊性,导致了compass搜索功能不能实现,考虑使用了js前台拼字符串的方式传递给后台做query String。

具体的业务是这样的,一个档案(lawsuitArchive)实体类是一个主要的实体类,当事人和档案之间的关系如下:

 

//lawsuitArchive 源码	
// 相关当事人
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "lawsuitArchive")
	private Set<Party> partys = new HashSet<Party>();

 

 而在当事人那边有如下映射:

 

	@ManyToOne(cascade = CascadeType.REFRESH)
	@JoinColumn(name = "lawsuitArchiveID")
	@SearchableComponent(refAlias="LawsuitArchive")
	private LawsuitArchive lawsuitArchive;
 

 

但是要求的搜索条件是:在同一个面板中使用同时搜索LawsuitArchive,还有Party的类容,大家都知道compass是基于pojo的搜索。故而要实现这样的搜索势必有点点的困难。

要实现的功能如图:

功能是:如果不输关键字的情况下,可以查到时间段内的所有符合条件的信息,(当事人的信息)。如果关键字存在的话,也要能查到符合条件数据。档案的实现很方便,立马能实现(案号中含有年度,时间段好确定),但是依据当事人档案的映射关系,当事人中没有年度这个属性,无奈之下,在当事人中间增加了一个冗余字段caseNo(案号),以便控制时间段。但是问题又来了。即使有了时间段这个属性,还是很困难的一件事情,因为要同时处理连个alias:LawsuiArchive 和 alias:Party,当然是用Struts2 的MVC结构的话,要的到连个不同的结果,就要返回到两个不同的jsp页面来显示。无奈之下,遍采取了如下的js方式:

 

 

function add() {
	var startTime = document.getElementById("startTime").value.substring(0, 4);
	var endTime = document.getElementById("endTime").value.substring(0, 4);
	var archive = document.getElementById("archive").value;
	var archivestate = document.getElementById("archivestate").value;
	var field = document.getElementById("field").value;
	var operation = document.getElementById("operation").value;
	var keyword = document.getElementById("keyword").value;
	var contact = document.getElementById("contact").value;

	var queryStr;

	if (keyword == "" && startTime == "" && endTime == "") {
		alert("请输入要检索的关键词,或时间段");
		return;
	} else if (keyword == "" && (startTime != "" || endTime != "")) {
		if (startTime == "" && endTime != "") {
			startTime = (new Date()).getYear();
		} else {
			endTime = (new Date()).getYear();
		}
		if (field != "party") {// 如果不是当事人的话
			// alert(field);//弹出字段
			field = "";
		}
	}
	var timefieldtext = startTime + "-" + endTime;
	if (keyword.indexOf(" ") != -1 && "date" != operation
			&& "number" != operation)
		keyword = "\"" + keyword + "\"";
	if (field != "" && keyword != "") {// 如果字段是存在的.--关键字也是存在的
		if ("~" == operation) {
			queryStr = " " + field + ":" + keyword + operation + " " + contact;
		} else if ("leftone" == operation) {
			queryStr = " " + field + ":" + "?" + keyword + " " + contact;
		} else if ("rightone" == operation) {
			queryStr = " " + field + ":" + keyword + "?" + " " + contact;
		} else if ("bothone" == operation) {
			queryStr = " " + field + ":" + "?" + keyword + "?" + " " + contact;
		} else if ("leftmany" == operation) {
			queryStr = " " + field + ":" + "*" + keyword + " " + contact;
		} else if ("rightmany" == operation) {
			queryStr = " " + field + ":" + keyword + "*" + " " + contact;
		} else if ("bothmany" == operation) {
			queryStr = " " + field + ":" + "*" + keyword + "*" + " " + contact;
		} else if ("number" == operation) {
			var keyw = keyword.split(":");
			skeyword = "[" + keyw[0] + " TO " + keyw[1] + "]";
			queryStr = " " + field + ":" + skeyword + " " + contact;
		} else if ("date" == operation) {
			var keyw = keyword.split(":");
			if (keyw.length == 1)
				keyw = keyword.split(":");
			var patrn = /^[1-2]{1}[0-9]{1}[0-9]{1}[0-9]{1}-[0-1]{1}[0-9]{1}-[0-3]{1}[0-9]{1}$/;
			String.prototype.trim = function() {
				return this.replace(/^\s+|\s+$/g, "");
			}
			if (!patrn.exec(keyw[0].trim()) || !patrn.exec(keyw[1].trim())) {
				alert("日期格式不正确,必须为1900-02-12格式");
				return;
			}

			skeyword = "[" + keyw[0] + " TO " + keyw[1] + "]";
			queryStr = " " + field + ":" + skeyword + " " + contact;
		} else {
			queryStr = " " + operation + field + ":" + keyword + " " + contact;
		}

	} else if ((field == "" || field == "party") && keyword == "") {
		queryStr = "";
	}

	var timeText = " ( ";
	if (timefieldtext != "-") {
		if (startTime > endTime) {// 调换位置时间的开始时间和结束时间
			var tempTime = startTime;
			startTime = endTime;
			endTime = tempTime;
		}
		for (var i = 0; startTime <= endTime; i++) {
			// +caseNo:仿盛大发生 OR +caseNo:仿盛大发生 OR +caseNo:道德
			timeText += " +caseNo:" + startTime + " OR";
			startTime++;
		}
		timeText = timeText.substring(0, timeText.lastIndexOf("OR"));
		queryStr += timeText + " ) ";
	}

	if (keyword == "" && field == "party") {// 当事人的话,不考虑归档与否
		queryStr = "+archive:" + archive + " AND" + queryStr + "@party:";
	} else if (keyword != "" && field != "party") {// 案子的话需要考虑归档与否
		queryStr = "+archive:" + archive + " AND +state:" + archivestate
				+ " AND" + queryStr;
	} else if (keyword != "" && field == "party") {// 当事人的话,不考虑归档与否
		queryStr = "+archive:" + archive + " AND" + queryStr;
	}else if (keyword == "" && field != "party") {// 案子的话需要考虑归档与否
		queryStr = "+archive:" + archive + " AND +state:" + archivestate
				+ " AND" + queryStr;
	}
	 alert(queryStr);
	document.getElementById('queryString').value = (document
			.getElementById('queryString').value == undefined ? "" : document
			.getElementById('queryString').value)
			+ queryStr;

	var archivetext = document.getElementById("archive").options[document
			.getElementById("archive").selectedIndex].text;
	var archivestatetext = document.getElementById("archivestate").options[document
			.getElementById("archivestate").selectedIndex].text;

	var fieldtext = document.getElementById("field").options[document
			.getElementById("field").selectedIndex].text;
	var operationtext = document.getElementById("operation").options[document
			.getElementById("operation").selectedIndex].text;
	var contacttext = document.getElementById("contact").options[document
			.getElementById("contact").selectedIndex].text;

	document.getElementById("archivetext").innerHTML = document
			.getElementById("archivetext").innerHTML
			+ "<div>" + archivetext + "</div>";
	document.getElementById("archivestatetext").innerHTML = document
			.getElementById("archivestatetext").innerHTML
			+ "<div>" + archivestatetext + "</div>";
	document.getElementById("timefieldtext").innerHTML = document
			.getElementById("timefieldtext").innerHTML
			+ "<div>" + timefieldtext + "</div>";
	document.getElementById("fieldtext").innerHTML = document
			.getElementById("fieldtext").innerHTML
			+ "<div>" + fieldtext + "</div>";
	document.getElementById("operationtext").innerHTML = document
			.getElementById("operationtext").innerHTML
			+ "<div>" + operationtext + "</div>";
	document.getElementById("keywordtext").innerHTML = document
			.getElementById("keywordtext").innerHTML
			+ "<div>" + keyword + "</div>";
	document.getElementById("contacttext").innerHTML = document
			.getElementById("contacttext").innerHTML
			+ "<div>" + contacttext + "</div>";
	var subbuttontext = "<img src='/images/button-.gif' width='14' style='cursor:pointer' height='14' onclick=\"sub('"
			+ queryStr
			+ "','"
			+ archivetext
			+ "','"
			+ archivestatetext
			+ "','"
			+ timefieldtext
			+ "','"
			+ fieldtext
			+ "','"
			+ operationtext
			+ "','"
			+ keyword + "','" + contacttext + "',this);\"/>";
	document.getElementById("subbutton").innerHTML = document
			.getElementById("subbutton").innerHTML
			+ "<div>" + subbuttontext + "</div>";
}
function dealwith() {
	var items = document.getElementsByName("fields");
	if (items.length) {
		for (var i = 0; i < items.length; i++) {
			if (items[i].checked) {
				items[i].checked = false;
			} else {
				items[i].checked = true;
			}
		}
	}
}
function search(alias) {
	var str = document.getElementById('queryString').value;
	if (str.length < 1) {
		alert("请添加搜索条件");
		return false;
	}
	var partyStr = str.substring(str.lastIndexOf(" "), str.length);
	str = str.substring(0, str.lastIndexOf(" "));
	if (str.indexOf("party:") != -1 || partyStr != " ") {
		alias = " AND +alias:Party ";
		document.getElementById('searchform').action = "/archiveReadIn/lawsuitArchiveSynthesizeSearch!searchParty.action";
	}
	document.getElementById('queryString').value = str + alias;
	dealwith();
	document.getElementById('searchform').submit();
}
function sub(delStr, delarchivetext, delarchivestatetext, deltimeText,
		delfieldtext, deloperationtext, delkeywordtext, delcontacttext, obj) {
	var archivetext = document.getElementById("archivetext");
	var archivestatetext = document.getElementById("archivestatetext");
	var datefeild = document.getElementById("timefieldtext");
	var fieldtext = document.getElementById("fieldtext");
	var operationtext = document.getElementById("operationtext");
	var keywordtext = document.getElementById("keywordtext");
	var contacttext = document.getElementById("contacttext");
	archivetext.innerHTML = deleteString(archivetext.innerHTML, delarchivetext);
	archivestatetext.innerHTML = deleteString(archivestatetext.innerHTML,
			delarchivestatetext);
	datefeild.innerHTML = deleteString(datefeild.innerHTML, deltimeText);
	fieldtext.innerHTML = deleteString(fieldtext.innerHTML, delfieldtext);
	operationtext.innerHTML = deleteString(operationtext.innerHTML,
			deloperationtext);
	keywordtext.innerHTML = deleteString(keywordtext.innerHTML, delkeywordtext);
	contacttext.innerHTML = deleteString(contacttext.innerHTML, delcontacttext);
	obj.style.display = "none";

	var str = document.getElementById('queryString').value;
	str = deleteString(str, delStr);
	document.getElementById('queryString').value = str;
}
// 提取查找字符串前面所有的字符
function getFront(mainStr, searchStr) {
	foundOffset = mainStr.indexOf(searchStr);
	if (foundOffset == -1) {
		return null;
	}
	return mainStr.substring(0, foundOffset);
}
// 提取查找字符串后面的所有字符
function getEnd(mainStr, searchStr) {
	foundOffset = mainStr.indexOf(searchStr);
	if (foundOffset == -1) {
		return null;
	}
	return mainStr.substring(foundOffset + searchStr.length, mainStr.length);
}
// 在字符串 searchStr 前面插入字符串 insertStr
function insertString(mainStr, searchStr, insertStr) {
	var front = getFront(mainStr, searchStr);
	var end = getEnd(mainStr, searchStr);
	if (front != null && end != null) {
		return front + insertStr + searchStr + end;
	}
	return null;
}
// 删除字符串 deleteStr
function deleteString(mainStr, deleteStr) {
	return replaceString(mainStr, deleteStr, "");
}
// 将字符串 searchStr 修改为 replaceStr
function replaceString(mainStr, searchStr, replaceStr) {
	var front = getFront(mainStr, searchStr);
	var end = getEnd(mainStr, searchStr);
	if (front != null && end != null) {
		return front + replaceStr + end;
	}
	return null;
}

 

最后形成的字符串:LawsuitArvhive 不含关键字:

 

16:22:37,220 INFO  [com.lzjw.court.utils.SecurityConfig] 当前系统已经启用安全子系统
---------------------------------------------
queryString=+archive:penal AND +state:archived AND (  +caseNo:2008 OR +caseNo:2009 OR +caseNo:2010  ) AND +alias:LawsuitArchive 
查找到的数目=3

 含有关键字:

 

16:23:55,347 INFO  [com.lzjw.court.utils.SecurityConfig] 当前系统已经启用安全子系统
---------------------------------------------
queryString=+archive:penal AND +state:archived AND +caseNo:案号 AND (  +caseNo:2008 OR +caseNo:2009 OR +caseNo:2010  ) AND +alias:LawsuitArchive 
查找到的数目=1
 

 当事人 party含有关键字:

 

16:24:49,231 INFO  [com.lzjw.court.utils.SecurityConfig] 当前系统已经启用安全子系统
16:24:49,258 INFO  [com.lzjw.court.common.service.impl.PartyManagerImpl] hits:3
16:24:49,258 INFO  [com.lzjw.court.common.service.impl.PartyManagerImpl] queryString:+archive:penal AND +party:当事人 AND (  +caseNo:2008 OR +caseNo:2009 OR +caseNo:2010  ) AND +alias:Party 

 当事人不含关键字:

 

16:25:47,972 INFO  [com.lzjw.court.utils.SecurityConfig] 当前系统已经启用安全子系统
16:25:47,985 INFO  [com.lzjw.court.common.service.impl.PartyManagerImpl] hits:11
16:25:47,985 INFO  [com.lzjw.court.common.service.impl.PartyManagerImpl] queryString:+archive:penal AND (  +caseNo:2008 OR +caseNo:2009 OR +caseNo:2010  ) AND +alias:Party 
 

勉勉强强的解决了问题。贴出来如果各位仁兄有好的意见和建议的话,请不惜赐教!

 

  • 大小: 5.1 KB
分享到:
评论
1 楼 BestUpon 2010-09-07  
看见了前面自己写的这个帖子,一个add()方法可真大呀!忍不住笑了。。

相关推荐

    compass对象搜索引擎

    综上所述,Compass对象搜索引擎通过提供面向对象的接口和强大的元数据映射,简化了Java开发者在应用中集成全文检索的复杂性,让搜索功能的实现变得更为高效和便捷。结合Lucene的优秀性能,Compass成为了一个强大的...

    ssh+compass实现站内搜索分页.rar

    Compass是一个基于Lucene的全文搜索引擎库,它简化了在Java应用中集成全文检索的功能。本教程将重点讲解如何使用SSH框架与Compass结合,实现在网站内的搜索分页功能。 首先,让我们深入了解SSH框架的每个组件: 1....

    struts2+spring2.5+hibernate3.26+compass2.1搜索引擎简单实现(无jar包)

    Compass是一款基于Lucene的全文搜索引擎,它使得Java应用能够方便地集成全文搜索功能。Compass提供了对JDBC、Hibernate等数据源的直接支持,可以自动索引数据库中的数据,实现快速检索。 在"struts2+spring2.5+...

    compass搜索引擎技术

    Compass搜索引擎技术是一种基于Lucene的全文检索框架,它提供了更高级别的API和集成机制,使得在Java应用程序中实现搜索引擎功能变得更加便捷。Compass的主要目标是将全文索引能力无缝地融入到现有的业务应用程序中...

    基于Lucene的搜索引擎框架Compass教程

    Compass是一个开源项目,它将Lucene的功能封装起来,提供了一套面向对象的API,简化了在Java应用中集成全文搜索引擎的过程。Compass不仅支持对关系数据库中的数据进行索引,还能与ORM框架如Hibernate、JPA等无缝集成...

    java搜索 compass资料

    它能够帮助开发者在 Java 应用程序中轻松实现复杂的搜索需求,并且具有较高的性能。Compass 基于 Lucene 构建,因此在使用上继承了 Lucene 的强大功能,同时又提供了更高级的抽象层,使得开发人员可以更加专注于业务...

    Spring ,JPA,Compass使用注解开发的博客站内搜索

    标题 "Spring ,JPA,Compass使用注解开发的博客站内搜索" 涉及的是在Java开发环境中,利用Spring框架、Java Persistence API (JPA) 和 Compass搜索引擎来实现一个博客系统的站内搜索功能。这是一项关键的技术,因为...

    S2SH+compass (实现站内全文检索)

    标题中的"S2SH+compass"指的是一个基于Struts2(S),Spring(S)和Hibernate(H)这三种开源框架的Java Web应用,再加上Compass搜索引擎来实现站内全文检索的功能。这种组合常用于构建复杂的企业级应用,因为它提供...

    Compass 的java代码

    1. **对象-搜索映射(OSM)**:Compass允许你定义对象-搜索映射,将Java对象与Lucene文档进行关联。这使得可以方便地将Java对象直接索引和检索,而无需处理Lucene的低级API。 2. **自动索引管理**:Compass能自动...

    使用compass+lucene实现简单的全文检索功能

    总的来说,使用 Compass 和 Lucene 实现全文检索功能,能够极大地提升 Java 应用的搜索体验,让开发者能够快速响应用户的查询需求。这两个工具的结合使用,不仅可以处理简单的文本搜索,还能够应对复杂的查询条件和...

    compass annotation关联关系

    总结,Compass Annotation 是 Compass 框架中的一个重要特性,通过它我们可以方便地定义对象与搜索引擎索引之间的关系,简化了数据索引和检索的实现。同时,通过灵活的关联关系注解,可以处理复杂的对象关系映射,...

    compass 全文搜索

    而Compass则在Lucene的基础上进行了封装,使得开发者可以更方便地在自己的应用程序中集成全文搜索功能。 Compass的核心特性包括: 1. **ORM集成**:Compass支持多种对象关系映射(ORM)框架,如Hibernate、JPA和...

    compass完整可用项目

    Compass提供了一种简单的方式来在Java应用程序中集成全文搜索功能,使得开发者可以方便地在数据库、文件系统等存储中的对象上进行高效的全文检索。 Lucene是Apache软件基金会的开源项目,它是一个高性能、全文本...

    COMPASS介绍

    COMPASS是一个强大的搜索引擎框架,它通过OSEM(Object/Search Engine Mapping)技术实现了应用对象的领域模型与搜索引擎之间的映射。相较于其他搜索引擎框架如Hibernate Search,COMPASS在某些方面展现出了更高的...

    COMPASS+spring构建自己的搜索引擎.pdf

    Compass是一个开源的搜索引擎库,它提供了与ORM框架(如Hibernate)的集成,使得能够将应用程序的对象模型直接映射到搜索引擎。 **Compass的核心概念和技术特点** 1. **Object/Search Engine Mapping (OSEM)**: ...

    Compass与ssh框架整合

    通过以上步骤,我们可以将Compass与SSH框架成功整合,实现一个具备强大搜索功能的企业级应用。这不仅可以提高用户体验,也对后台数据管理带来便利,是现代Web开发中一项重要的技术实践。在实际项目中,开发者需要...

Global site tag (gtag.js) - Google Analytics