比较复杂,可以支持多种逻辑符,包括+-andor空格等,并且根据需要随便增加。可以根据条件选择在那个表中搜索,对速度也做了优化,可以说是很快的。当然因为是以前写的,存在不少毛病。存储过程中用到几乎所有sqlserver的特性,如光标(记录集分页)等。好了,不吹了,自己看程序吧。
asp函数
复制代码 代码如下:
functionAnalyseKeyword(a_strSource)
dimm_strDest,m_intLoop
dimm_intBeginPos,m_intEndPos
dimm_strHead,m_strMiddle,m_strTail
m_strDest=a_strSource
'------------------------------处理空格------------------------------------------------------
'首先去掉头尾空格
m_strDest=ltrim(rtrim(m_strDest))
'将&,"and"等替换成+、-、空格
m_strDest=replace(m_strDest,"&","+")
m_strDest=replace(m_strDest,"AND","+")
m_strDest=replace(m_strDest,"OR",chr(32))
m_strDest=replace(m_strDest,"NOT","-")
'初始化变量,以使下面的循环进行
m_intBeginPos=1
dowhilem_intBeginPos<>0
m_intBeginPos=instr(m_strDest,chr(32))
ifm_intBeginPos<>0then'如果找到空格
m_strHead=rtrim(ltrim(left(m_strDest,m_intBeginPos)))
callprint("[AnalyseKeyword()]:处理空格m_strHead="+m_strHead)
m_strTail=rtrim(ltrim(right(m_strDest,len(m_strDest)-m_intBeginPos)))
callprint("[AnalyseKeyword()]:处理空格m_strTail="+m_strTail)
m_strDest=m_strHead+"*"+m_strTail
else
exitdo
endif
loop
m_strDest=replace(m_strDest,"*",chr(32))
callprint("[AnalyseKeyword()]:处理空格完毕后m_strDest="+m_strDest)
'-------------------------------空格处理完毕-------------------------------------------------
'-------------------处理单双引号-----------------------------------------------------
'首先将单引号替换为双引号
m_strDest=replace(m_strDest,chr(39),chr(34))
'置一个初值以使循环进行
m_intBeginPos=1
m_intEndPos=1
m_strHead=""
m_strTail=""
dowhilem_intBeginPos<>0andm_intEndPos<>0
'如果发现双引号,则记下开始位置,查找下一个双引号
m_intBeginPos=instr(m_strDest,chr(34))
ifm_intBeginPos<>0then'如果找到第一个引号
callprint("[AnalyseKeyword()]:第一个引号出现的位置:"+cstr(m_intBeginPos))
m_intEndPos=instr(m_intBeginPos+1,m_strDest,chr(34))
ifm_intEndPos<>0then'如果找到第二个引号
callprint("[AnalyseKeyword()]:第二个引号出现的位置:"+cstr(m_intEndPos))
'将整个字符串按引号分隔成三段
callprint("[AnalyseKeyword()]:处理引号m_strDest="+m_strDest)
m_strHead=left(m_strDest,m_intBeginPos-1)
callprint("[AnalyseKeyword()]:处理引号m_strHead="+m_strHead)
m_strMiddle=mid(m_strDest,m_intBeginPos+1,m_intEndPos-m_intBeginPos-1)
callprint("[AnalyseKeyword()]:处理引号m_strMiddle="+m_strMiddle)
m_strTail=right(m_strDest,len(m_strDest)-m_intEndPos)
callprint("[AnalyseKeyword()]:m_strTail="+m_strTail)
'如果在引号中有+号则作为字符处理,暂时替换成其他字符
m_strMiddle=replace(m_strMiddle,"+","|")
m_strDest=m_strHead+replace(rtrim(ltrim(m_strMiddle)),chr(32),"#")+m_strTail
else
exitdo
endif
else
exitdo
endif
loop
m_strDest=replace(m_strDest,chr(34),"+")
callprint("[AnalyseKeyword()]:处理引号完毕后m_strDest="+m_strDest)
'-------------------------------引号处理完毕-------------------------------------------------
'-------------------------------处理多个加号及加号两边的空格问题-----------------------------
'处理多个加号的问题,遇到多个加号则认为是字符串,而不是逻辑符
m_strDest=replace(m_strDest,"+++","|||")
m_strDest=replace(m_strDest,"++","||")
callprint("[AnalyseKeyword()]:处理多个减号完毕后m_strDest='"+m_strDest+"'")
'处理加号两边的空格
m_strDest=replace(m_strDest,"+","+")
m_strDest=replace(m_strDest,"+","+")
m_strDest=replace(m_strDest,"+","+")
callprint("[AnalyseKeyword()]:处理减号两边的空格完毕后m_strDest='"+m_strDest+"'")
'-------------------------------处理加号完毕-----------------------------
'-------------------------------处理多个减号及减号两边的空格问题-----------------------------
'处理多个减号的问题,遇到多个减号则认为是字符串,而不是逻辑符
m_strDest=replace(m_strDest,"---","~~~")
m_strDest=replace(m_strDest,"--","~~")
callprint("[AnalyseKeyword()]:处理多个减号完毕后m_strDest='"+m_strDest+"'")
'处理减号两边的空格
m_strDest=replace(m_strDest,"-","-")
m_strDest=replace(m_strDest,"-","-")
m_strDest=replace(m_strDest,"-","-")
callprint("[AnalyseKeyword()]:处理加号两边的空格完毕后m_strDest='"+m_strDest+"'")
'-------------------------------处理减号完毕-----------------------------
'------------------------------处理字符串两头的加减号问题-----------------
iflen(m_strDest)>=3then
m_strHead=left(m_strDest,1)
m_strMiddle=mid(m_strDest,2,len(m_strDest)-2)
m_strTail=right(m_strDest,1)
ifm_strHead="+"orm_strHead="-"then
m_strHead=""
endif
ifm_strTail="+"orm_strTail="-"then
m_strTail=""
endif
m_strDest=m_strHead+m_strMiddle+m_strTail
endif
'----------------------------处理完毕-------------------------------------
m_strDest=replace(m_strDest,"--","~~")
m_strDest=replace(m_strDest,"++","||")
m_strDest=replace(m_strDest,chr(32),"@")
AnalyseKeyword=m_strDest
callprint("[AnalyseKeyword()]:全部处理完毕后m_strDest='"+m_strDest+"'")
endfunction
%>
存储过程
/*********************************************************************/
/*procname:Up_ParseWordSearch*/
/**/
/*Description:关键字搜索*/
/**/
/*parameters:@a_strCategoryID分类id*/
/*@a_intPosition调用的位置*/
/*@a_strParseWord搜索关键字*/
/*@a_intRowCount限定最多取得记录数*/
/**/
/*date:2000/6/28*/
/**/
/*author:Liuyunpeng*/
/**/
/*history:*/
/*********************************************************************/
ifexists(select*fromsysobjectswhereid=object_id("up_ParseWordSearch"))
dropprocup_ParseWordSearch
go
createprocup_ParseWordSearch@a_strParsewordvarchar(255),
@a_strCategoryIDvarchar(255),
@a_intPositiontinyint,
@a_intRowCountint
as
declare@m_strSqlConditionvarchar(255)--Sql语句的条件部分
declare@m_strSqlSelectvarchar(255)--Sql语句的选择部分
declare@m_strSqlCategoryvarchar(100)--sql语句的分类部分
/*根据调用位置决定sql的选择部分*/
select@m_strSqlSelect
=case
when@a_intPosition=4then--商品库
"selectProductID,'Title'=ProductName,'Description'=left(Description,100)"
+"fromProductwhere"
when@a_intPosition=5then--商业机会库
"selectID,Title,'Description'=left(convert(varchar,content),100)"
+"fromBusinessChancewhere"
when@a_intPosition=6then--公司库
"selectCompanyID,'Title'=CompanyName,'Description'=left(Description,100)"
+"fromCompanywhere"
end
/*根据分类ID决定sql的分类部分*/
select@m_strSqlCategory
=case
when@a_strCategoryID<>"0"then"CategoryIDlike'"+@a_strCategoryID+"%'and"
else""
end
/*根据调用位置决定sql的条件部分*/
select@m_strSqlCondition
=case
when@a_intPosition=4--商品
then"(ProductNamelike'%"+@a_strParseWord+"%'"
+"orDescriptionlike'%"+@a_strParseWord+"%'"
+"orProducerNamelike'%"+@a_strParseWord+"%')"
when@a_intPosition=5--商业机会
then"(Titlelike'%"+@a_strParseWord+"%'"
+"orKeywordlike'%"+@a_strParseWord+"%')"
when@a_intPosition=6
then"(CompanyNamelike'%"+@a_strParseWord+"%'"
+"orDescription'%"+@a_strParseWord+"%')"
end
setrowcount@a_intRowCount
exec(@m_strSqlSelect+@m_strSqlCategory+@m_strSqlCondition)
setrowcount0
go