Ausführungsumgebung: IIS
Skriptsprache: VBScript
Datenbank: Access/SQL Server
Datenbanksprache: SQL
1. Zusammenfassung:
Ob in dynamischen Websites wie Foren, News-Systemen oder Download-Systemen, Sie sehen oft Suchfunktionen: Suche nach Beiträgen, Suche nach Benutzern, Suche nach Software (kurz: Suche nach Schlüsselwörtern) usw. Dieser Artikel stellt vor, wie man eine erstellt Effiziente Praktische, ASP-basierte Website-Mehrwertsuche.
In diesem Artikel geht es um die „Fuzzy-Matching-Suche mit mehreren Bedingungen“. Nachdem Sie mehrere Bedingungen verstanden haben, ist die Suche nach einer einzigen Bedingung ein Kinderspiel. Im Allgemeinen gibt es zwei Methoden für die Suche mit mehreren Bedingungen: die Aufzählungsmethode und die progressive Methode. Wenn nicht zu viele Suchbedingungen vorhanden sind ( n <= 3), kann die Aufzählungsmethode verwendet werden. Die Häufigkeit der Anweisungen beträgt 2 hoch n , wobei n die Bedingungszahl exponentiell erhöht. Wenn die Anzahl der Bedingungen zunimmt, sollte natürlich unabhängig von der Effizienz oder Realisierbarkeit des Programms die progressive Methode angewendet werden. Die Anweisungshäufigkeit beträgt n und wächst linear. Es sollte darauf hingewiesen werden, dass die Idee der Aufzählungsmethode sehr einfach ist. Sie bestimmt nacheinander, ob die Bedingungen leer sind, und sucht dann nach den nicht leeren Bedingungen. Gleichzeitig kann die Wahrheitstabellentechnologie verwendet werden verwendet werden, um mit Situationen mit extrem vielen Bedingungen umzugehen (ich glaube, niemand wird so etwas tun). Wenn es 4 Bedingungen gibt, muss man 16 Gruppen von Aussagen schreiben); die progressive Methode ist raffinierter und konzentriert sich auf das Verständnis. Das erste ist die Verwendung von Flags (Flag) und das zweite ist die clevere Verwendung von String-Verbindungen in SQL symbol&. Im Folgenden wird anhand von Beispielen der Aufbau des Motors erläutert.
2. Beispiel:
Wir erstellen eine Adressbuch-Abfrage-Engine. Der Datenbankname lautet „addressbook.mdb“, der Tabellenname lautet „address“ und die Felder lauten wie folgt:
ID | Name | Tel. | Schule |
1 | Zhang San | 33333333 | Fakultät für Informatik, University of Electronic Science and Technology of China |
2 | Li Si | 44444444 | Fakultät für Biologie, Sichuan University |
3 | Wang Er | 22222222 | Fakultät für Architektur, Southwest Jiaotong University |
… | … | … | … |
Die Websuchoberfläche sieht wie folgt aus:
Name: | Telefon: | Schule: | Suchschaltfläche |
Das Quellprogramm, das die Aufzählungsmethode verwendet, lautet wie folgt:
<%@ CODEPAGE = "936" %>
'Mit Datenbank verbinden
<%
dim conn
dim DBOath
dim rs
dim sql
Set conn=Server.CreateObject("ADODB.Connection")
DBPath = Server .MapPath ("addressbook.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
Set rs=Server.CreateObject("ADODB.Recordset")
'Name und Telefon abrufen Nummer von der Webseite, der Wert der Schule
dim Name
dim Tel
dim School
Name=request("Name")
Tel=request("Tel")
School=request("School")
'Der Suchkern der Aufzählungsmethode, Da es drei Bedingungen gibt, müssen 8 Sätze von If-Beurteilungsanweisungen geschrieben werden:
if trim(Name)="" and trim(Tel)="" and trim(School)="" then
sql="select * from address order". nach ID asc"
end if
if trim(Name)= "" and trim(Tel)="" and trim(School)<>"" then
sql="select * from address where School like '%"&trim(School)& "%' order by ID asc"
end if
if trim (Name)="" and trim(Tel)<>"" and trim(School)="" then
sql="select * from address where Tel like '%"&trim (Tel)&"%' order by ID asc"
end if
if trim(Name)="" and trim(Tel)<>"" and trim(School)<>"" then
sql="select * from address where Tel wie '%"&trim(Tel)&"%' und Schule wie '%"&trim(School)&"%' order by ID asc"
end if
if trim(Name)<>"" and trim(Tel)="" and trim(School)="" then
sql=" select * from address where Name like '%"&trim(Name)&"%' order by ID asc"
end if
if trim(Name)<>"" and trim(Tel )="" und trim(School)<>" " dann
sql="select * from address where Name like '%"&trim(Name)&"%' and School like '%"&trim(School)&"%' order nach ID asc"
end if
if trim(Name)< >"" and trim(Tel)<>"" and trim(School)="" then
sql="select * from address where Name like '%"&trim(Name) &"%' und Tel wie '%"&trim( Tel)&"%' order by ID asc"
end if
if trim(Name)<>"" and trim(Tel)<>"" and trim(School)<> "" then
sql="select * from address where Name like '%"&trim(Name)&"%' and Tel like '%"&trim(Tel)&"%' and School like '%"&trim(School)&" %' order by ID asc"
end if
rs.open sql,conn,1,1
'Suchergebnisse anzeigen,
wenn rs.eof und rs.bof then
Response.write "Es gibt keinen Eintrag im aktuellen Adressbuch"
else
do while not rs.eof
Response.write "Name:"&rs("Name" )&"Telephone:"&rs("Tel")&"School:"&rs("School")&"<br>"
rs.movenext
Schleife
endet, wenn
'Trennen Sie die Verbindung zur Datenbank
set rs=nothing
conn.close
set conn=nothing
%>
Konzentrieren Sie sich beim Verständnis des obigen Programms auf den Kernteil. Die 8 Gruppen von Anweisungen entsprechen nacheinander den 8 Zuständen in den 3 Suchfeldern.
Name | Tel. | Schule |
| |
Leer | | Nicht | Leer | Leer |
Leer | |
Leer | |
| Nicht |
Leer | |
|
Darüber hinaus ist trim() eine VB-Funktion, die die Leerzeichen vor und nach der Eingabezeichenfolge entfernt; % ist ein Platzhalter mit mehreren Zeichen in der SQL-Sprache (_ ist ein Platzhalter mit einem Zeichen), sodass %" &trim()&"% ist sehr nützlich für das Suchfeld. Die eingegebenen Schlüsselwörter werden jeweils von links nach rechts abgeglichen; in der SQL-Sprache wird eine Verbindung verwendet, um anzugeben, dass zwischen nicht leeren Bedingungen eine „AND“-Beziehung besteht.
Werfen wir einen Blick auf die progressive Methode. Sie unterscheiden sich nur im Kern:
„Der Suchkern der progressiven Methode besteht darin, zu beurteilen, ob die Bedingung leer ist oder nicht.“ zur Suchbedingung
sql="select * from address where"
if Name<>"" then
sql=sql&" Name like '%"&Name&"%' "
flag=1
end if
if Tel<>"" and flag=1 then
sql=sql&" und Tel wie '%"&Tel&"% '"
flag=1
elseif Tel<>"" then
sql=sql&" Tel wie '%"&Tel&"%'"
flag=1
end if
if Company<>"" und flag=1 then
sql=sql&" and Company like ' %"&Company&"%'"
flag=1
elseif Company <>"" then
sql=sql&" Company like '%"&Company&"%'"
flag=1
end if
if flag=0 then
sql="select * from address order by ID asc"
end if
rs.open sql,conn,1,1
Die Progressionsmethode ist ein intelligenter Algorithmus, was allein schon an der Länge der Anweisungen zu erkennen ist. Die Schwierigkeit und das Wesentliche dieses Algorithmus liegen in Flag und &. Zunächst sollten Sie wissen, dass & ein Zeichenkettenverkettungssymbol in SQL ist, das die Zeichen um das Symbol herum zusammenfügt. Zurück zum Programm, wenn Name nicht leer ist, sql="select * from address where Name like '%"&Name&"%' "and flag=1 next, wenn Name nicht leer ist und Tel nicht leer ist Tel<>"" und flag=1, sql="select * from address where Name like '%"&Name&"%' and Tel like '%"&Tel&"%' "while flag=1, andernfalls, wenn Name leer ist, Tel Not empty, sql="select * from address where Tel like '%"&Tel&"%' "and flag=1 and so on, es kann erweitert werden, um mit n Bedingungen zu suchen. Wenn alle Bedingungen leer sind, dh Flag = 0, werden natürlich alle Elemente in allen Tabellen ausgewählt.
3. verifizieren:
An diesem Punkt wird eine Suchmaschine eingerichtet. Hier einige Anwendungsbeispiele:
Name: Zhang | Telefon: | Schule: | Suchschaltfläche |
Die Suchergebnisse sind:
Name: Zhang San Tel.: 33333333 Abteilung: Fakultät für Informatik, Universität für elektronische Wissenschaft und Technologie Chinas
Name: | Telefon: | Schule: | Suchschaltfläche für | Hochschule
Die Suchergebnisse sind:
Name: Zhang San Tel.: 33333333 Abteilung: Abteilung für Informatik, Universität für elektronische Wissenschaft und Technologie von China
Name Li Si Tel.: 44444444 Abteilung: Abteilung für Biologie, Sichuan-Universität
Name: Wang Er Tel.: 22222222 Einheit: Fakultät für Architektur, Southwest Jiaotong University
Name: | Telefon: 4444 | Schule: Sichuan | Suchschaltfläche |
Die Suchergebnisse sind:
Name Li Si Telefon: 44444444 Abteilung: Abteilung für Biologie, Sichuan-Universität
Name: | Telefon: | Schule: Gehalt% Große | Suchschaltfläche |
Die Suchergebnisse sind:
Name: Wang Er Telefon: 22222222 Abteilung: Fakultät für Architektur, Southwest Jiaotong University
4. verbessern:
Tatsächlich weist diese Engine immer noch einige Mängel auf. Das Problem liegt hauptsächlich im Platzhalterzeichen %. Dies liegt einerseits daran, dass die Leute es gewohnt sind, * als Platzhalterzeichen zu verwenden. Wenn andererseits % in einem Hyperlink erscheint, wird % wie folgt „gefressen“, wenn es über eine Anfrage abgerufen wird:
--test.htm--
…
<a href=test.asp?content=test%the%sign>klicken Sie hier</a>
…
--test.asp--
<%
content=request("content")
Antwort. Inhalt schreiben
%>
Wenn Sie test.htm im IE durchsuchen, klicken Sie auf den Hyperlink und er wird wie folgt angezeigt:
testthesign
Es ist ersichtlich, dass % vom Hyperlink direkt ignoriert wird. Wie können wir dieses Problem lösen? Es ist ganz einfach, wir machen einen kleinen Trick: Wir untergraben den Balken und tauschen die Säule aus.
Fügen Sie den folgenden Code vor dem Suchkern hinzu:
Name=replace(Name,"*","%")
Tel=replace(Tel,"*","%")
Firma=replace(Firma,"*","%")
Fügen Sie nach dem Suchkern den folgenden Code hinzu:
Name=replace(Name,"%","*")
Tel=replace(Tel,"%","*")
Firma=replace(Firma,"%","*")
Lassen Sie uns diese Aussagen analysieren. replace() ist eine String-Ersetzungsfunktion in VB. replace(Name,"*","%") dient zum Ersetzen aller * in Name durch %. Mit anderen Worten: Wir ersetzen alle Vorkommen von * in den drei Bedingungen durch %, sodass die Platzhalterzeichen in den ersten drei Sätzen in * geändert werden. Die nächsten drei Sätze können verhindern, dass % „gefressen“ wird. Alle Probleme werden gelöst.
Name: | Telefon: | Schule: Gehalt % Große | Suchschaltfläche |
Die Suchergebnisse sind:
Name: Wang Er Tel.: 22222222 Abteilung: Fakultät für Architektur, Southwest Jiaotong University
Ändern Sie die obige Aussage erneut und ersetzen Sie * durch Leerzeichen. Wäre es nicht so, dass wir in Google und Baidu häufig Leerzeichen verwenden, um Suchbedingungen zu trennen?
Ausführungsumgebung: IIS
Skriptsprache: VBScript
Datenbank: Access/SQL Server
Datenbanksprache: SQL
1. Zusammenfassung:
Ob in dynamischen Websites wie Foren, News-Systemen oder Download-Systemen, Sie sehen oft Suchfunktionen: Suche nach Beiträgen, Suche nach Benutzern, Suche nach Software (kurz: Suche nach Schlüsselwörtern) usw. Dieser Artikel stellt vor, wie man eine erstellt Effiziente Praktische, ASP-basierte Website-Mehrwertsuche.
In diesem Artikel geht es um die „Fuzzy-Matching-Suche mit mehreren Bedingungen“. Nachdem Sie mehrere Bedingungen verstanden haben, ist die Suche nach einer einzigen Bedingung ein Kinderspiel. Im Allgemeinen gibt es zwei Methoden für die Suche mit mehreren Bedingungen: die Aufzählungsmethode und die progressive Methode. Wenn nicht zu viele Suchbedingungen vorhanden sind ( n <= 3), kann die Aufzählungsmethode verwendet werden. Die Häufigkeit der Anweisungen beträgt 2 hoch n , wobei n die Bedingungszahl exponentiell erhöht. Wenn die Anzahl der Bedingungen zunimmt, sollte natürlich unabhängig von der Effizienz oder Realisierbarkeit des Programms die progressive Methode angewendet werden. Die Anweisungshäufigkeit beträgt n und wächst linear. Es sollte darauf hingewiesen werden, dass die Idee der Aufzählungsmethode sehr einfach ist. Sie bestimmt nacheinander, ob die Bedingungen leer sind, und sucht dann nach den nicht leeren Bedingungen. Gleichzeitig kann die Wahrheitstabellentechnologie verwendet werden verwendet werden, um mit Situationen mit extrem vielen Bedingungen umzugehen (ich glaube, niemand wird so etwas tun). Wenn es 4 Bedingungen gibt, muss man 16 Gruppen von Aussagen schreiben); die progressive Methode ist raffinierter und konzentriert sich auf das Verständnis. Das erste ist die Verwendung von Flags (Flag) und das zweite ist die clevere Verwendung von String-Verbindungen in SQL symbol&. Im Folgenden wird anhand von Beispielen der Aufbau des Motors erläutert.
2. Beispiel:
Wir erstellen eine Adressbuch-Abfrage-Engine. Der Datenbankname lautet „addressbook.mdb“, der Tabellenname lautet „address“ und die Felder lauten wie folgt:
ID | Name | Tel. | Schule |
1 | Zhang San | 33333333 | Fakultät für Informatik, University of Electronic Science and Technology of China |
2 | Li Si | 44444444 | Fakultät für Biologie, Sichuan University |
3 | Wang Er | 22222222 | Fakultät für Architektur, Southwest Jiaotong University |
… | … | … | … |
Die Websuchoberfläche sieht wie folgt aus:
Name: | Telefon: | Schule: | Suchschaltfläche |
Das Quellprogramm, das die Aufzählungsmethode verwendet, lautet wie folgt:
<%@ CODEPAGE = "936" %>
'Mit Datenbank verbinden
<%
dim conn
dim DBOath
dim rs
dim sql
Set conn=Server.CreateObject("ADODB.Connection")
DBPath = Server .MapPath ("addressbook.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
Set rs=Server.CreateObject("ADODB.Recordset")
'Name und Telefon abrufen Nummer von der Webseite, der Wert der Schule
dim Name
dim Tel
dim School
Name=request("Name")
Tel=request("Tel")
School=request("School")
'Der Suchkern der Aufzählungsmethode, Da es drei Bedingungen gibt, müssen 8 Sätze von If-Beurteilungsanweisungen geschrieben werden:
if trim(Name)="" and trim(Tel)="" and trim(School)="" then
sql="select * from address order". nach ID asc"
end if
if trim(Name)= "" and trim(Tel)="" and trim(School)<>"" then
sql="select * from address where School like '%"&trim(School)& "%' order by ID asc"
end if
if trim (Name)="" and trim(Tel)<>"" and trim(School)="" then
sql="select * from address where Tel like '%"&trim (Tel)&"%' order by ID asc"
end if
if trim(Name)="" and trim(Tel)<>"" and trim(School)<>"" then
sql="select * from address where Tel wie '%"&trim(Tel)&"%' und Schule wie '%"&trim(School)&"%' order by ID asc"
end if
if trim(Name)<>"" and trim(Tel)="" and trim(School)="" then
sql=" select * from address where Name like '%"&trim(Name)&"%' order by ID asc"
end if
if trim(Name)<>"" and trim(Tel )="" und trim(School)<>" " dann
sql="select * from address where Name like '%"&trim(Name)&"%' and School like '%"&trim(School)&"%' order nach ID asc"
end if
if trim(Name)< >"" and trim(Tel)<>"" and trim(School)="" then
sql="select * from address where Name like '%"&trim(Name) &"%' und Tel wie '%"&trim( Tel)&"%' order by ID asc"
end if
if trim(Name)<>"" and trim(Tel)<>"" and trim(School)<> "" then
sql="select * from address where Name like '%"&trim(Name)&"%' and Tel like '%"&trim(Tel)&"%' and School like '%"&trim(School)&" %' order by ID asc"
end if
rs.open sql,conn,1,1
'Suchergebnisse anzeigen,
wenn rs.eof und rs.bof then
Response.write "Es gibt keinen Eintrag im aktuellen Adressbuch"
else
do while not rs.eof
Response.write "Name:"&rs("Name" )&"Telephone:"&rs("Tel")&"School:"&rs("School")&"<br>"
rs.movenext
Schleife
endet, wenn
'Trennen Sie die Verbindung zur Datenbank
set rs=nothing
conn.close
set conn=nothing
%>
Konzentrieren Sie sich beim Verständnis des obigen Programms auf den Kernteil. Die 8 Gruppen von Anweisungen entsprechen nacheinander den 8 Zuständen in den 3 Suchfeldern.
Name | Tel. | Schule |
| |
Leer | | Nicht | Leer | Leer |
Leer | |
Leer | |
| Nicht |
Leer | |
|
Darüber hinaus ist trim() eine VB-Funktion, die die Leerzeichen vor und nach der Eingabezeichenfolge entfernt; % ist ein Platzhalter mit mehreren Zeichen in der SQL-Sprache (_ ist ein Platzhalter mit einem Zeichen), sodass %" &trim()&"% ist sehr nützlich für das Suchfeld. Die eingegebenen Schlüsselwörter werden jeweils von links nach rechts abgeglichen; in der SQL-Sprache wird eine Verbindung verwendet, um anzugeben, dass zwischen nicht leeren Bedingungen eine „AND“-Beziehung besteht.
Werfen wir einen Blick auf die progressive Methode. Sie unterscheiden sich nur im Kern:
„Der Suchkern der progressiven Methode besteht darin, zu beurteilen, ob die Bedingung leer ist oder nicht.“ zur Suchbedingung
sql="select * from address where"
if Name<>"" then
sql=sql&" Name like '%"&Name&"%' "
flag=1
end if
if Tel<>"" and flag=1 then
sql=sql&" und Tel wie '%"&Tel&"% '"
flag=1
elseif Tel<>"" then
sql=sql&" Tel wie '%"&Tel&"%'"
flag=1
end if
if Company<>"" und flag=1 then
sql=sql&" and Company like ' %"&Company&"%'"
flag=1
elseif Company <>"" then
sql=sql&" Company like '%"&Company&"%'"
flag=1
end if
if flag=0 then
sql="select * from address order by ID asc"
end if
rs.open sql,conn,1,1
Die Progressionsmethode ist ein intelligenter Algorithmus, was allein schon an der Länge der Anweisungen zu erkennen ist. Die Schwierigkeit und das Wesen dieses Algorithmus liegen in Flag und &. Zunächst sollten Sie wissen, dass & ein Zeichenkettenverkettungssymbol in SQL ist, das die Zeichen um das Symbol herum zusammenfügt. Zurück zum Programm, wenn Name nicht leer ist, sql="select * from address where Name like '%"&Name&"%' "and flag=1 next, wenn Name nicht leer ist und Tel nicht leer ist Tel<>"" und flag=1, sql="select * from address where Name like '%"&Name&"%' and Tel like '%"&Tel&"%' "while flag=1, andernfalls, wenn Name leer ist, Tel Not empty, sql="select * from address where Tel like '%"&Tel&"%' "and flag=1 und so weiter, es kann auf die Suche mit n Bedingungen erweitert werden. Wenn alle Bedingungen leer sind, dh Flag = 0, werden natürlich alle Elemente in allen Tabellen ausgewählt.
3. verifizieren:
An diesem Punkt wird eine Suchmaschine eingerichtet. Hier einige Anwendungsbeispiele:
Name: Zhang | Telefon: | Schule: | Suchschaltfläche |
Die Suchergebnisse sind:
Name: Zhang San Tel.: 33333333 Abteilung: Fakultät für Informatik, Universität für elektronische Wissenschaft und Technologie Chinas
Name: | Telefon: | Schule: | Suchschaltfläche für | Hochschule
Die Suchergebnisse sind:
Name: Zhang San Tel.: 33333333 Abteilung: Abteilung für Informatik, Universität für elektronische Wissenschaft und Technologie von China
Name Li Si Tel.: 44444444 Abteilung: Abteilung für Biologie, Sichuan-Universität
Name: Wang Er Tel.: 22222222 Einheit: Fakultät für Architektur, Southwest Jiaotong University
Name: | Telefon: 4444 | Schule: Sichuan | Suchschaltfläche |
Die Suchergebnisse sind:
Name Li Si Telefon: 44444444 Abteilung: Abteilung für Biologie, Sichuan-Universität
Name: | Telefon: | Schule: Gehalt % Große | Suchschaltfläche |
Die Suchergebnisse sind:
Name: Wang Er Telefon: 22222222 Abteilung: Fakultät für Architektur, Southwest Jiaotong University
4. verbessern:
Tatsächlich weist diese Engine immer noch einige Mängel auf. Das Problem liegt hauptsächlich im Platzhalterzeichen %. Dies liegt einerseits daran, dass die Leute es gewohnt sind, * als Platzhalterzeichen zu verwenden. Wenn andererseits % in einem Hyperlink erscheint, wird % wie folgt „gefressen“, wenn es über eine Anfrage abgerufen wird:
--test.htm--
…
<a href=test.asp?content=test%the%sign>klicken Sie hier</a>
…
--test.asp--
<%
content=request("content")
Antwort. Inhalt schreiben
%>
Wenn Sie test.htm im IE durchsuchen, klicken Sie auf den Hyperlink und er wird wie folgt angezeigt:
testthesign
Es ist ersichtlich, dass % vom Hyperlink direkt ignoriert wird. Wie können wir dieses Problem lösen? Es ist ganz einfach, wir machen einen kleinen Trick: Wir untergraben den Balken und tauschen die Säule aus.
Fügen Sie den folgenden Code vor dem Suchkern hinzu:
Name=replace(Name,"*","%")
Tel=replace(Tel,"*","%")
Firma=replace(Firma,"*","%")
Fügen Sie nach dem Suchkern den folgenden Code hinzu:
Name=replace(Name,"%","*")
Tel=replace(Tel,"%","*")
Firma=replace(Firma,"%","*")
Lassen Sie uns diese Aussagen analysieren. replace() ist eine String-Ersetzungsfunktion in VB. replace(Name,"*","%") dient zum Ersetzen aller * in Name durch %. Mit anderen Worten: Wir ersetzen alle Vorkommen von * in den drei Bedingungen durch %, sodass die Platzhalterzeichen in den ersten drei Sätzen in * geändert werden. Die nächsten drei Sätze können verhindern, dass % „gefressen“ wird. Alle Probleme werden gelöst.
Name: | Telefon: | Schule: Gehalt % Große | Suchschaltfläche |
Die Suchergebnisse sind:
Name: Wang Er Tel.: 22222222 Abteilung: Fakultät für Architektur, Southwest Jiaotong University
Ändern Sie die obige Aussage erneut und ersetzen Sie * durch Leerzeichen. Wäre es nicht so, dass wir in Google und Baidu häufig Leerzeichen verwenden, um Suchbedingungen zu trennen?