想做一个搜索数据库的引擎,怎么做啊?
比如,输入深圳闪盘,他会按“深圳闪盘”、"深圳"和"闪盘"来搜索,
而不是只搜索"深圳闪盘"或搜索"深"、"圳"、"闪"、"盘"。
问题点数:20、回复次数:28Top
1 楼myboll(jim)回复于 2004-12-02 10:22:10 得分 0
??????????????Top
2 楼butcher2002(我又出来捣乱了)回复于 2004-12-02 10:32:51 得分 5
这个要建立索引库
比如"深"、"圳"、"闪"、"盘"独立存在于索引库才可以Top
3 楼lwlmaomao()回复于 2004-12-02 10:58:29 得分 5
呵,你意思是接词组来搜索。“深圳闪盘”、"深圳"和"闪盘"是词组,而“深”、“圳”、“闪”、“盘”不是词组?如果要这样的话比较麻烦:)Top
4 楼myboll(jim)回复于 2004-12-02 11:25:20 得分 0
高手来看看我抄的算法,查询没有问题.但是怎么让查询的字段以不同颜色显示呢?
比如:查"深圳闪盘",在结果中有"深圳","闪盘"的都显示红色?
<form name="frm_Search" method="get" action="Search.asp">
<p> <input name="key" type="text" size="25" maxlength="50"><br>
<input type="submit" value=" 搜索 "></p>
</form>
<%
Dim S_Key,RST,StrSQL
S_Key = Trim(Request("key")) '得到搜索关键字的值
If S_Key <>"" then
Set RST=Server.CreateObject("ADODB.RecordSet")
StrSQL=AutoKey(S_Key) '此处使用自定义函数 AutoKey(),该函数为实现智能搜索的核心
RST.Open StrSQL,newsconn,3,2 '得到搜索后的记录
If RST.BOF And RST.EOF Then
response.write "<font color=#FF0000>未找到任何结果!!!</font> "
Else
%>
搜索名称为“<font color="#FF0000"><%= S_Key %></font>”的项,共找到 <font color="#FF0000"><%= RST.RecordCount %></font> 项:<p>
<%
While Not RST.EOF '遍历整个记录集,显示搜索到的信息并设置链接
%>
< !-- 此处可设为你所需要的链接目标 -->
<font style="font: 12pt 宋体"><a href="info.asp?ID=<%= RST("ID") %>" target="_blank"><%= RST("Name") %></a></font><br>
< !-- 显示部分详细内容 -->
<font style="font: 9pt 宋体"><%= Left(RST("profile"),150) %></font><p>
<%
RST.MoveNext
Wend
end if
RST.close
set RST = Nothing
end if
%>
<%
Function AutoKey(strKey)
CONST lngSubKey=2
Dim lngLenKey, strNew1, strNew2, i, strSubKey
'检测字符串的合法性,若不合法则转到出错页。出错页你可以根据需要进行设定。
if InStr(strKey,"=")<>0 or InStr(strKey,"`")<>0 or InStr(strKey,"'")<>0 or InStr(strKey," ")<>0 or InStr(strKey," ")<>0 or InStr(strKey,"'")<>0 or InStr(strKey,chr(34))<>0 or InStr(strKey,"\")<>0 or InStr(strKey,",")<>0 or InStr(strKey,"<")<>0 or InStr(strKey,">")<>0 then
Response.Redirect "error.htm"
End If
lngLenKey=Len(strKey)
Select Case lngLenKey
Case 0 '若为空串,转到出错页
Response.Redirect "error.htm"
Case 1 '若长度为1,则不设任何值
strNew1=""
strNew2=""
Case Else '若长度大于1,则从字符串首字符开始,循环取长度为2的子字符串作为查询条件
For i=1 To lngLenKey-(lngSubKey-1)
strSubKey=Mid(strKey,i,lngSubKey)
strNew1=strNew1 & " or Name like '%" & strSubKey & "%'"
strNew2=strNew2 & " or salekeywords like '%" & strSubKey & "%'"
Next
End Select
'得到完整的SQL语句
AutoKey="Select * from userinfo where Name like '%" & strKey & "%' or salekeywords like '%" & strKey & "%'" & strNew1 & strNew2
AutoKey=AutoKey & " order by gade,keywords,jifen"
End Function
%>
<%
newsconn.close
set newsConn = Nothing
%>Top
5 楼myboll(jim)回复于 2004-12-02 11:27:58 得分 0
如果仅仅显示"深圳闪盘"为红色那好办,replace就行了
现在想要,strSubKey=Mid(strKey,i,lngSubKey) 中的strSubKey都显示红色,怎么弄?
高手指教啊Top
6 楼myboll(jim)回复于 2004-12-02 11:34:00 得分 0
???????????????????????????????
???????????????????????????????????????/
??????????????????????????????????????????Top
7 楼butcher2002(我又出来捣乱了)回复于 2004-12-02 11:49:43 得分 9
我写过一个简单的~不适用于大量数据
是类似于新浪搜索相关新闻的
比如 软件会议召开
数据库定义搜索关键字有 软件 会议
先看用一个循环判断每个关键字是否包含于搜索条件,建立数组
包含则添加 text=text+ "or 字段 like '%"&关键字&"%'"
最后组合查询条件 把text左边3个字符去掉~就可以了Top
8 楼myboll(jim)回复于 2004-12-03 17:49:47 得分 0
那你那没有办法排序啊
比如:搜索"北京电子"
按理说第一个要显示含有"北京电子"条目
然后显示含有"北京"和"电子"的条目
现在,你text=text+ "or 字段 like '%"&关键字&"%'" 是没有规则的排序啊?????????????
谁能解决啊,大峡们??
大家来看一下下面的语句:
For i=1 To lngLenKey-(lngSubKey-1)
strSubKey=Mid(strKey,i,lngSubKey)
strNew1=strNew1 & " or Name like '%" & strSubKey & "%'"
strNew2=strNew2 & " or salekeywords like '%" & strSubKey & "%'"
Next
'得到完整的SQL语句
AutoKey="Select * from userinfo where Name like '%" & strKey & "%' or salekeywords like '%" & strKey & "%'" & strNew1 & strNew2
AutoKey=AutoKey & " order by gade,keywords,jifen"
怎么让匹配 strKey 的显示在前,匹配 strNew1 strNew2的显示在后呢?(order by 后面的可以改变)Top
9 楼myboll(jim)回复于 2004-12-03 18:05:46 得分 0
比如:搜索"北京电子"
按理说第一个要显示含有"北京电子"条目
然后显示含有"北京"和"电子"的条目
谁能解决啊,大峡们??
嘿嘿,现在智能搜索啦,亮色显示啦,快速分页啦全都搞定,但是在模糊查询时怎么让匹配长的字符串显示也靠前呢?
我用google搜索"美宝网",第一条显示为含有美宝网的条目,下面才是含美宝、网之类的条目,他是怎么实现的呢Top
10 楼myboll(jim)回复于 2004-12-03 18:15:41 得分 0
有兴趣学习、参考 或 指教 的朋友到下面地址一试:
http://www/myboll.com/sz
真诚期待你的建议。嘿嘿排序拦着我了
到底如何可以先按匹配字符串排序,然后按order by 后面的fields来排序呢???????Top
11 楼sys9933(草人)回复于 2004-12-03 18:39:01 得分 0
studyTop
12 楼myboll(jim)回复于 2004-12-04 09:33:42 得分 0
解决上面我说的排序问题,现在又来了新问题(悲惨啊!!!!!!!!!),如下:
当我输入 "china game" 时,百度和GOOGLE都自动认为他是英语字,并分别按"china"、“game”来查询,而我写的只能按“ch”,“in”等两个字母查询。
就是说,一律当作汉字来处理了。
怎么才能输入“北京电子世界”时,按照“北京电子世界”、“北京”、“电子”、“世界”来查询(已经实现),输入"beijing dian zi shi jie"却可以按照"beijing","dian","zi","shi","jie"来查询(没有实现~~~~~~~~~~~~~~~~~~~~~~~~~~)。
大虾请不吝赐教。
在下先谢谢了。Top
13 楼myboll(jim)回复于 2004-12-04 09:55:31 得分 0
就是说,我怎么才能知道查询输入的是英文字?????????
如果查询关键字里面是这样“北京电子conputer”,应该按照“北京电子computer”、“北京”、“电子”、“computer”来查询。
如果查询关键字里面是这样“China Super conputer”,应该按照“China Super conputer”,"china","super","computer"来查询
大家帮忙啊!!!!!!!Top
14 楼Juniorman(心在灿烂中死去,爱在灰烬中重生)回复于 2004-12-04 10:04:24 得分 0
路过
学习....Top
15 楼myboll(jim)回复于 2004-12-04 10:30:41 得分 0
奶奶的雄,如果输入纯英文字咱也能搞定(如下),如果混合输入怎么办呢(我上面提的问题)
strSubKey = Split(strKey, " ")
For i = 0 To UBound(strSubKey)
strSubKey=Mid(strKey,i,lngSubKey)
strNew1=strNew1 & " or Name like '%" & strSubKey(i) & "%'"
strNew2=strNew2 & " or salekeywords like '%" & strSubKey(i) & "%'"
Next
如果混合输入怎么办呢(我上面提的问题) Top
16 楼myboll(jim)回复于 2004-12-04 10:36:25 得分 0
哦多了一行strSubKey=Mid(strKey,i,lngSubKey)Top
17 楼myboll(jim)回复于 2004-12-04 12:25:13 得分 0
??????????????????????Top
18 楼tigerhu76(虎虎)回复于 2004-12-04 13:29:10 得分 0
学习中……Top
19 楼myboll(jim)回复于 2004-12-04 14:30:07 得分 0
现在问题又来了:
当我输入"北京电子时" 是按照"北京电子","北京","电子"模糊查找,用OR 上面已经实现了.
要精确查找怎么办?比如输入"北京 电子 清华 物理系",现在以空格split,然后找出完全符合"北京","电子","清华","物理系"条件,而且数据库里面需要两个字段来匹配,怎么实现????
下面的OR简单换成 and 也不行啊??
strSubKey = Split(strKey, " ")
For i = 0 To UBound(strSubKey)
strNew1=strNew1 & " and Name like '%" & strSubKey(i) & "%'"
strNew2=strNew2 & " and salekeywords like '%" & strSubKey(i) & "%'"
strNew3=strNew3 & " and title like '%" & strSubKey(i) & "%'"
Next
因为单字段和子串之间是and的关系,而3个字段之间是OR的关系啊,怎么搞定来实现精确查询呢??
(name like '%" & strSubKey(0) & "%' and name like '%" & strSubKey(1) & "%') or (salekeywords like '%" & strSubKey(0) & "%' and salekeywords like '%" & strSubKey(1) & "%') OR (title like '%" & strSubKey(0) & "%' and title like '%" & strSubKey(1) & "%')
有没有简单点的发方法??????????????Top
20 楼federer8250()回复于 2004-12-04 16:32:36 得分 0
关注中Top
21 楼lishuai818(李坏)回复于 2004-12-04 18:03:33 得分 0
路过~~~进来歇息一会Top
22 楼myboll(jim)回复于 2004-12-04 19:07:04 得分 0
模糊查询问题总结如下:(大家帮忙啊)
1:排序问题:如何让匹配字数多的关键字的记录排在记录的上面,例如查询关键字里面是这样"北京电子",那么应该先显示含有"北京电子"的记录,然后显示含有"北京"的记录,然后显示含有"电子"的纪律.
2:关键字判断问题:如果查询关键字里面是这样“北京电子computer”,应该按照“北京电子computer”、“北京”、“电子”、“computer”来查询。(conputer不要拆开).
精确查询问题如下:
上面两个问题依然存在
3:精确的匹配问题:比如查询关键字是"北京 电子 中管村",如何只显示如下记录:记录的指定几个FIELDS(如:title,name,profile)包含"北京""电子""中管村",三个关键字一个都不能少.
Top
23 楼sun94510451(中原)回复于 2004-12-04 20:37:55 得分 1
要截取字符串Top
24 楼myboll(jim)回复于 2004-12-06 09:48:52 得分 0
截取字符串?当然都截取了
但是这样按这些字符串根据字你要求排序呢???
Top
25 楼myboll(jim)回复于 2004-12-06 09:55:03 得分 0
精确查询问题如下:
3:精确的匹配问题:比如查询关键字是"北京 电子 中管村",如何只显示如下记录:记录的指定几个FIELDS(如:title,name,profile)包含"北京""电子""中管村",三个关键字一个都不能少
意思是说:在title,name,profile中只要能找全"北京""电子""中管村"三个关键字,就显示.(当然包括,仅仅profile中只要能找全"北京""电子""中管村"三个关键字也显示....)Top
26 楼jdh2010(小金)回复于 2004-12-06 10:33:24 得分 0
学习中……Top
27 楼heluqing(鉴之小河〖劳累求充实〗)(vcl .net)回复于 2004-12-06 10:44:08 得分 0
学习Top
28 楼myboll(jim)回复于 2004-12-06 12:16:51 得分 0
刚才看了网友的帖子,我感觉也是个问题,在这里称为第四条
4: 如果表中 profile 字段为TEXT,检索很费时间,怎样才能减少检索len(不同的字段)>150时的时间Top




