做的一个项目要求有搜索功能,就是用了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
分享到:
相关推荐
综上所述,Compass对象搜索引擎通过提供面向对象的接口和强大的元数据映射,简化了Java开发者在应用中集成全文检索的复杂性,让搜索功能的实现变得更为高效和便捷。结合Lucene的优秀性能,Compass成为了一个强大的...
Compass是一个基于Lucene的全文搜索引擎库,它简化了在Java应用中集成全文检索的功能。本教程将重点讲解如何使用SSH框架与Compass结合,实现在网站内的搜索分页功能。 首先,让我们深入了解SSH框架的每个组件: 1....
Compass是一款基于Lucene的全文搜索引擎,它使得Java应用能够方便地集成全文搜索功能。Compass提供了对JDBC、Hibernate等数据源的直接支持,可以自动索引数据库中的数据,实现快速检索。 在"struts2+spring2.5+...
Compass搜索引擎技术是一种基于Lucene的全文检索框架,它提供了更高级别的API和集成机制,使得在Java应用程序中实现搜索引擎功能变得更加便捷。Compass的主要目标是将全文索引能力无缝地融入到现有的业务应用程序中...
Compass是一个开源项目,它将Lucene的功能封装起来,提供了一套面向对象的API,简化了在Java应用中集成全文搜索引擎的过程。Compass不仅支持对关系数据库中的数据进行索引,还能与ORM框架如Hibernate、JPA等无缝集成...
它能够帮助开发者在 Java 应用程序中轻松实现复杂的搜索需求,并且具有较高的性能。Compass 基于 Lucene 构建,因此在使用上继承了 Lucene 的强大功能,同时又提供了更高级的抽象层,使得开发人员可以更加专注于业务...
标题 "Spring ,JPA,Compass使用注解开发的博客站内搜索" 涉及的是在Java开发环境中,利用Spring框架、Java Persistence API (JPA) 和 Compass搜索引擎来实现一个博客系统的站内搜索功能。这是一项关键的技术,因为...
标题中的"S2SH+compass"指的是一个基于Struts2(S),Spring(S)和Hibernate(H)这三种开源框架的Java Web应用,再加上Compass搜索引擎来实现站内全文检索的功能。这种组合常用于构建复杂的企业级应用,因为它提供...
1. **对象-搜索映射(OSM)**:Compass允许你定义对象-搜索映射,将Java对象与Lucene文档进行关联。这使得可以方便地将Java对象直接索引和检索,而无需处理Lucene的低级API。 2. **自动索引管理**:Compass能自动...
总的来说,使用 Compass 和 Lucene 实现全文检索功能,能够极大地提升 Java 应用的搜索体验,让开发者能够快速响应用户的查询需求。这两个工具的结合使用,不仅可以处理简单的文本搜索,还能够应对复杂的查询条件和...
总结,Compass Annotation 是 Compass 框架中的一个重要特性,通过它我们可以方便地定义对象与搜索引擎索引之间的关系,简化了数据索引和检索的实现。同时,通过灵活的关联关系注解,可以处理复杂的对象关系映射,...
而Compass则在Lucene的基础上进行了封装,使得开发者可以更方便地在自己的应用程序中集成全文搜索功能。 Compass的核心特性包括: 1. **ORM集成**:Compass支持多种对象关系映射(ORM)框架,如Hibernate、JPA和...
Compass提供了一种简单的方式来在Java应用程序中集成全文搜索功能,使得开发者可以方便地在数据库、文件系统等存储中的对象上进行高效的全文检索。 Lucene是Apache软件基金会的开源项目,它是一个高性能、全文本...
COMPASS是一个强大的搜索引擎框架,它通过OSEM(Object/Search Engine Mapping)技术实现了应用对象的领域模型与搜索引擎之间的映射。相较于其他搜索引擎框架如Hibernate Search,COMPASS在某些方面展现出了更高的...
Compass是一个开源的搜索引擎库,它提供了与ORM框架(如Hibernate)的集成,使得能够将应用程序的对象模型直接映射到搜索引擎。 **Compass的核心概念和技术特点** 1. **Object/Search Engine Mapping (OSEM)**: ...
通过以上步骤,我们可以将Compass与SSH框架成功整合,实现一个具备强大搜索功能的企业级应用。这不仅可以提高用户体验,也对后台数据管理带来便利,是现代Web开发中一项重要的技术实践。在实际项目中,开发者需要...