Некоторое время назад я написал функцию нечеткого поиска по нескольким полям (похожую на Baidui). Код функции следующий
'============================================== = =
'Имя функции: ключевое слово_sousuo
'Функция: генерировать условия запроса sql
'Параметры: table_field ------ имена полей таблицы (через запятую)
' ключевое слово ------ Ключевые слова для поиска (разделяются пробелами)
'Возврат: условия запроса sql
'============================================== = =
функция ключевое слово_sousuo (byval table_field, ключевое слово byval)
dim str01,str02,ключевые слова,table_fields,i,j
table_fields=split(обрезка(table_field),,)
ключевые слова = разделить (обрезать (ключевое слово),,)
если поле_таблицы<> тогда
str01=(&table_fields(0)& например '%&keyword&%'
от j=0 до ubound(table_fields)
str01=str01& или &table_fields(j)&, например '%&keyword&%'
следующий
стр01=строка01&)
еще
response.Write(<script>alert('Ошибка параметра (не может быть пустым)!')</script>)
ответ.Конец()
конец, если
'Полная ширина -> пространство половинной ширины
'ключевое слово = заменить (ключевое слово, , )
'пока InStr(ключевое слово, )>0
' ключевое слово = заменить (ключевое слово, , )
'уходи
ключевые слова = разделить (ключевое слово, )
если ubound(ключевые слова)>0, то
для i=0 до ubound(ключевые слова)
str02=str02&(&table_fields(0)& например '%&keywords(i)&%'
от j=1 до ubound(table_fields)
str02=str02& или &table_fields(j)&, например '%&keywords(i)&%'
следующий
стр02=строка02&)
следующий
str02=(&replace(str02,)(,)and()&)
ключевое слово_sousuo=( & str01 & или & str02 & )
еще
ключевое слово_sousuo=str01
конец, если
конечная функция
'============================================== = =
'Имя функции: ключевое слово_тег
'Функция: пометить ключевые слова в строке красным цветом.
'Параметр: str ------ строка
' ключевое слово ------ отметить ключевые слова (разделять пробелами)
'Возврат: строка (формат HTML)
'============================================== = =
функция ключевое слово_tag (byval str, ключевое слово byval)
неяркие ключевые слова,str01,str02,i
'Полная ширина -> пространство половинной ширины
'ключевое слово = заменить (ключевое слово, , )
'пока InStr(ключевое слово, )>0
' ключевое слово = заменить (ключевое слово, , )
'уходи
str01=replace(str,keyword,<font color=#ff0000>&keyword&</font>)
ключевые слова = разделить (ключевое слово, )
если ubound(ключевые слова)>0, то
стр02=стр
для i=0 до ubound(ключевые слова)
str02=replace(str02,keywords(i),<font color=#ff0000>&keywords(i)&</font>)
следующий
ключевое слово_tag=str02
еще
ключевое слово_tag=str01
конец, если
конечная функция
Ниже приведен пример http://www.zhouhaihe.com/blog/uploads/200604/recordread.asp.
<%@LANGUAGE=КОДОВАЯ СТРАНИЦА VBSCRIPT=936%>
<%
опция явная
dim conn,connstr,база данных
connstr=DBQ=+server.mappath(record.mdb)+;DefaultDir=;DRIVER={Драйвер Microsoft Access (*.mdb)};
set conn=server.CreateObject(adodb.connection)
conn.open connstr
dim n,rs,page,keyword,keywords,RecordCount,pageCount,pos,i,sql_where
п=50
страница = Запрос (страница)
ключевое слово = обрезка (запрос (ключевое слово))
sql_where=keyword_sousuo(заголовок,cz,имя,время,ключевое слово)
установите rs=server.CreateObject(adodb.recordset)
rs.open выберите * из записи, где &sql_where& упорядочить по идентификатору desc,conn,1,2
если страница=0, то
страница=1
конец, если
РекордКаунт = 0
делай, пока не rs.Eof
RecordCount = RecordCount +1
RS.MoveNext
петля
если не RecordCount=0, то
RS.MoveFirst
конец, если
pageCount=RecordCount/n
pageCount = int (pageCount)
если (RecordCount mod n)>0, то
PageCount=Количество страниц +1
конец, если
%>
<тип стиля=текст/css>
<!--
.STYLE3 {цвет: #666666}
-->
</стиль>
<ширина таблицы=100% граница=0 cellspace=0 cellpadding=0>
<form id=form1 name=form1 метод=post action=?><tr><td align=center><input name=keyword type=text id=keyword value=<%=keyword%> size=30 />
<тип ввода=имя отправки=значение отправки=поиск/>
<span class=STYLE3>(Разделяйте ключевые слова пробелами) </span></td>
</tr></form>
<тр>
<td height=5></td>
</таблица>
<ширина таблицы=600 border=1 align=center cellpadding=4>
<tr align=центр>
<td width=131>Заголовок</td>
<td width=131>Действие</td>
<td width=131>Имя пользователя</td>
<td width=132>Время</td>
</tr>
<%pos=0
делать, пока pos<(page-1)*n
поз=поз+1
rs.moveСледующий
петля
я = 0
пока не rs.eof и i<n
я=я+1%>
<tr align=центр>
<td><%=keyword_tag(rs(title),ключевое слово)%></td>
<td><%=keyword_tag(rs(cz),ключевое слово)%></td>
<td><%=keyword_tag(rs(name),ключевое слово)%></td>
<td><%=keyword_tag(rs(время),ключевое слово)%></td>
</tr>
<%rs.movenext
идти
RS.закрыть
установить rs=ничего
конн.закрыть
установить соединение = ничего
'============================================== = =
'Имя функции: ключевое слово_sousuo
'Функция: генерировать условия запроса sql
'Параметры: table_field ------ имена полей таблицы (через запятую)
' ключевое слово ------ Ключевые слова для поиска (разделяются пробелами)
'Возврат: условия запроса sql
'============================================== = =
функция ключевое слово_sousuo (byval table_field, ключевое слово byval)
dim str01,str02,ключевые слова,table_fields,i,j
table_fields=split(обрезка(table_field),,)
ключевые слова = разделить (обрезать (ключевое слово),,)
если поле_таблицы<> тогда
str01=(&table_fields(0)& например '%&keyword&%'
от j=0 до ubound(table_fields)
str01=str01& или &table_fields(j)&, например '%&keyword&%'
следующий
стр01=строка01&)
еще
response.Write(<script>alert('Ошибка параметра (не может быть пустым)!')</script>)
ответ.Конец()
конец, если
'Полная ширина -> пространство половинной ширины
ключевое слово = заменить (ключевое слово, , )
' while InStr(ключевое слово, )>0
' ключевое слово = заменить (ключевое слово, , )
'уходи
ключевые слова = разделить (ключевое слово, )
если ubound(ключевые слова)>0, то
для i=0 до ubound(ключевые слова)
str02=str02&(&table_fields(0)& например '%&keywords(i)&%'
от j=1 до ubound(table_fields)
str02=str02& или &table_fields(j)&, например '%&keywords(i)&%'
следующий
стр02=строка02&)
следующий
str02=(&replace(str02,)(,)and()&)
ключевое слово_sousuo=( & str01 & или & str02 & )
еще
ключевое слово_sousuo=str01
конец, если
конечная функция
'============================================== = =
'Имя функции: ключевое слово_тег
'Функция: пометить ключевые слова в строке красным цветом.
'Параметр: str ------ строка
' ключевое слово ------ отметить ключевые слова (разделять пробелами)
'Возврат: строка (формат HTML)
'============================================== = =
функция ключевое слово_tag (byval str, ключевое слово byval)
неяркие ключевые слова,str01,str02,i
'Полная ширина -> пространство половинной ширины
ключевое слово = заменить (ключевое слово, , )
'пока InStr(ключевое слово, )>0
' ключевое слово = заменить (ключевое слово, , )
'уходи
str01=replace(str,keyword,<font color=#ff0000>&keyword&</font>)
ключевые слова = разделить (ключевое слово, )
если ubound(ключевые слова)>0, то
стр02=стр
для i=0 до ubound(ключевые слова)
str02=replace(str02,keywords(i),<font color=#ff0000>&keywords(i)&</font>)
следующий
ключевое слово_tag=str02
еще
ключевое слово_tag=str01
конец, если
конечная функция
тусклый
%> <tr align=center>
<td colspan=4> <%=RecordCount%><font color=#FF0000><%=page%></font>/<%=pageCount%> страниц
<%=n%> страниц/страница переходит по адресу:
<SELECT name=select onchange=window.open(this.options[selectedIndex].value,'_self') >
<%y=1
делай, пока y<pagecount+1%>
<OPTION value=?page=<%=y%>&keyword=<%=server.URLEncode(keyword)%> <%if cstr(page)=cstr(y) then response.Write( selected) end if%> > Страница <%=y%></OPTION>
<%y=y+1
цикл%>
</SELECT></td>
</tr>
</таблица>