실행 환경: IIS
스크립트 언어: VBScript
데이터베이스: Access/SQL Server
데이터베이스 언어: SQL
1. 요약:
포럼, 뉴스 시스템, 다운로드 시스템 등 동적 웹사이트에서 게시물 검색, 사용자 검색, 소프트웨어 검색(간단히 키워드 검색) 등의 검색 기능을 자주 볼 수 있습니다. 효율적인 ASP 기반 사이트 다중값 검색.
이 기사에서는 "다중 조건 퍼지 일치 검색"을 다루고 있습니다. 여러 조건을 이해하고 나면 단일 조건 검색은 매우 쉽습니다. 일반적으로 다중 조건 검색에는 열거형(enumeration) 방식과 점진적(progressive) 방식의 두 가지 방법이 있습니다. 검색 조건이 너무 많지 않은 경우( n <=3), 문장의 빈도는 2의 n승 이며, n 은 조건 수만큼 증가합니다. 물론, 조건의 수가 증가할 경우에는 프로그램의 효율성이나 구현 가능성에 관계없이 점진적인 방법을 채택해야 하며 명령문 빈도는 n 이며 선형적으로 증가합니다. 열거 방법의 아이디어는 매우 간단하다는 점을 지적해야 합니다. 조건이 비어 있는지 여부를 하나씩 확인한 다음 비어 있지 않은 조건에 따라 검색하는 동시에 진리표 기술을 사용할 수 있습니다. 조건이 매우 많은 상황을 처리하는 데 사용됩니다(아무도 이런 일을 하지 않을 것이라고 믿습니다). 4가지 조건이 있는 경우 16개의 진술 그룹을 작성해야 합니다. 이해에 초점을 맞춘 진보적 방법이 더 독창적입니다. 첫 번째는 플래그(flag)를 사용하는 것이고, 두 번째는 SQL 기호&에서 문자열 연결을 영리하게 사용하는 것입니다. 다음은 엔진의 구축을 예시를 통해 설명합니다.
2. 예:
주소록 쿼리 엔진을 구축합니다. 데이터베이스 이름은 addressbook.mdb이고 테이블 이름은 address이며 필드는 다음과 같습니다.
ID | 이름 | 전화 | 학교 |
1 | Zhang San | 33333333 | 중국 전자 과학 기술 대학교 컴퓨터 공학과 |
2 | Li Si | 44444444 | 쓰촨 대학교 생물학과 |
3 | Wang Er | 22222222 | 서남 교통 대학교 건축학과 |
… | … | … | … |
웹 검색 인터페이스는 다음과 같습니다.
열거 방식을 사용한 소스 프로그램은 다음과 같다.
<%@ CODEPAGE = "936" %>
'데이터베이스에 연결
<%
희미 conn
희미 DBOath
희미 rs
희미 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
희미 Tel
희미 School
Name=request("Name")
Tel=request("Tel")
School=request("School")
'열거 방식의 검색 핵심, 세 가지 조건이 있기 때문에,
Trim(Name)="" and Trim(Tel)="" and Trim(School)="" then
sql="select * from address order
이면 8조의 If 판단문을 작성해야 합니다. by ID asc"
end if
if Trim(Name)= "" and Trim(Tel)="" and Trim(School)<>"" then
sql="select * from address from School like '%"&trim(School)& "%' order by ID asc"
end if
if Trim (Name)="" and Trim(Tel)<>"" and Trim(School)="" then
sql="select * from address from address like '%"&trim (Tel)&"%' order by ID asc"
end if
if Trim(Name)="" and Trim(Tel)<>"" and Trim(School)<>"" then
sql="select * from address from Tel where Tel like '%"&trim(Tel)&"%' and School like '%"&trim(School)&"%' order by ID asc"
end if
if Trim(Name)<>"" and Trim(Tel)="" and Trim(School)="" then
sql=" select * from address from '%"&trim(Name)&"%' order by ID asc"
end if
if Trim(Name)<>"" and Trim(Tel )="" and Trim(School)<>" " then
sql="'%"&trim(Name)&"%'와 같은 이름 및 '%"&trim(School)&"%'와 같은 학교 순서가 있는 주소에서 *를 선택합니다. by ID asc"
end if
if Trim(Name)< >"" and Trim(Tel)<>"" and Trim(School)="" then
sql="select * from address from name like '%"&trim(Name) &"%' 및 Tel like '%"&trim( Tel)&"%' order by ID asc"
end if
if 트림(이름)<>"" 및 트림(전화)<>"" 및 트림(학교)<> "" 그런 다음
sql="이름은 '%"&trim(Name)&"%', 전화는 '%"&trim(Tel)&"%', 학교는 '%"&trim(School)&"과 같은 주소에서 *를 선택하세요. %' order by ID asc"
end if
rs.open sql,conn,1,1
'검색 결과 표시
if rs.eof 및 rs.bof then
response.write "현재 주소록에 레코드가 없습니다."
else
do while not rs.eof
response.write "이름:"&rs("이름" )&"전화:"&rs("전화")&"학교:"&rs("학교")&"<br>"
rs.movenext
루프
끝 if
'데이터베이스 연결 끊기
세트 rs=nothing
conn.close
set conn=nothing
%>
위 프로그램을 이해할 때 핵심 부분에 집중하세요. 8개의 문장 그룹은 3개의 검색창에 있는 8개의 상태에 하나씩 대응됩니다.
이름 | 전화번호 | 학교 |
| |
비어 있음 | | 비어 | 있음 비어 있음 비어 | 있음 비어 |
있음 비어 있음 비어 있음 비어 있음 비어 있음 | 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 | 있음 비어 있음 비어 있음 |
| 비어 있음 | 비어 있음
비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 | 않음 |
비어 | |
또한, Trim()은 입력 문자열 앞뒤의 공백을 제거하는 VB 함수인데, %는 SQL 언어에서 다중 문자 와일드카드(_는 단일 문자 와일드카드)이므로 %"라는 것을 알 수 있습니다. &trim()&"%는 검색 상자에 매우 유용합니다. 에 입력된 키워드는 각각 왼쪽에서 오른쪽으로 일치합니다. SQL 언어에서는 연결이 비어 있지 않은 조건 사이에 "AND" 관계가 있음을 나타내는 데 사용됩니다.
열거형 방식과 비교하면 핵심적인 부분만 다르다:
'진행형 방식의 검색 핵심은 조건이 비어 있지 않은지 판단하는 것이다. 검색 조건
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&" and Tel like '%"&Tel&"% '"
flag=1
elseif Tel<>"" then
sql=sql&" Tel like '%"&Tel&"%'"
flag=1
end if
if Company<>"" and 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
진행 방식은 문장의 길이만으로도 알 수 있듯이 스마트 알고리즘입니다. 이 알고리즘의 난이도와 본질은 플래그와 &에 있습니다. 우선, &는 SQL의 문자열 연결 기호로 기호 주변의 문자를 함께 연결한다는 점을 알아야 합니다. 다시 프로그램으로 돌아가서, Name이 비어 있지 않으면 sql="select * from address where Name like '%"&Name&"%' "그리고 flag=1, Name이 비어 있지 않고 Tel이 비어 있지 않으면, 즉 Tel<>"" 및 플래그=1, sql="'%"&Name&"%'와 같은 이름과 '%"&Tel&"%'와 같은 Tel이 있는 주소에서 *를 선택하고 플래그=1인 동안, 그렇지 않으면 이름이 비어 있는 경우 Tel Not 비어 있음, sql="select * from address from Tel like '%"&Tel&"%' " 및 flag=1 등, n 조건으로 검색하도록 확장될 수 있습니다. 물론 조건이 모두 비어 있는 경우, 즉 flag=0이면 모든 테이블의 모든 항목이 선택됩니다.
3. 확인하다:
이 시점에서 검색 엔진이 설정됩니다. 다음은 몇 가지 사용 예입니다.
검색 결과는 다음과 같습니다.
이름: Zhang San 전화: 33333333 단위: 중국 전자 과학 기술 대학 컴퓨터 과학과
검색 결과는 다음과 같습니다.
이름: Zhang San 전화: 33333333 단위: 중국 전자 과학 기술 대학 컴퓨터 과학과
이름 Li Si 전화: 44444444 단위: 쓰촨 대학교 생물학과
이름: Wang Er 전화: 22222222 단위: 서남교통대학교 건축학과
이름: | 전화: 4444 | 학교: 쓰촨 | 검색 버튼 |
검색 결과는 다음과 같습니다.
이름 Li Si 전화: 44444444 단위: 쓰촨대학교 생물학과
이름 : | 전화 : | 학교 : Pay% 큰 | 검색버튼 |
검색 결과는 다음과 같습니다.
이름: Wang Er 전화: 22222222 단위: 남서교통대학교 건축학과
4. 개선하다:
실제로 이 엔진에는 여전히 몇 가지 결함이 있습니다. 문제는 주로 와일드카드 문자 %에 있습니다. 한편으로는 사람들이 *를 와일드카드 문자로 사용하는 데 익숙하기 때문입니다. 반면에 %가 하이퍼링크에 나타나면 다음과 같이 요청을 통해 %를 "먹습니다".
--test.htm--
…
<a href=test.asp?content=test%the%sign>여기를 클릭하세요</a>
…
--test.asp--
<%
콘텐츠=요청("콘텐츠")
응답.내용 쓰기
%>
IE에서 test.htm을 검색할 때 하이퍼링크를 클릭하면 다음과 같이 표시됩니다.
시험하다
하이퍼링크에서는 %가 직접 무시되는 것을 볼 수 있습니다. 이 문제를 어떻게 해결할 수 있나요? 아주 간단합니다. 약간의 트릭을 사용합니다. 빔을 뒤집고 기둥을 바꾸는 것입니다.
검색 코어 앞에 다음 코드를 추가합니다.
이름=교체(이름,"*","%")
Tel=replace(전화,"*","%")
회사=교체(회사,"*","%")
검색 코어 뒤에 다음 코드를 추가합니다.
이름=교체(이름,"%","*")
Tel=replace(전화,"%","*")
회사=교체(회사,"%","*")
이 진술을 분석해 봅시다. replacement()는 VB의 문자열 대체 함수입니다. replacement(Name,"*","%")는 Name의 모든 *를 %로 바꾸는 것입니다. 즉, 세 가지 조건에서 *의 모든 발생을 %로 대체하여 처음 세 문장의 와일드카드 문자가 *로 변경됩니다. 다음 세 문장은 %가 "먹히는" 것을 방지할 수 있습니다. 모든 문제가 해결될 것입니다.
이름 : | 전화 : | 학교 : Pay% 큰 | 검색버튼 |
검색 결과는 다음과 같습니다.
이름: 왕얼 전화: 22222222 단위: 서남교통대학교 건축학과
위의 문장을 다시 바꿔서 *를 공백으로 바꾸면 구글과 바이두에서 검색조건을 구분하기 위해 흔히 공백을 사용하는 검색엔진이 되지 않을까요?
실행 환경: IIS
스크립트 언어: VBScript
데이터베이스: Access/SQL Server
데이터베이스 언어: SQL
1. 요약:
포럼, 뉴스 시스템, 다운로드 시스템 등 동적 웹사이트에서 게시물 검색, 사용자 검색, 소프트웨어 검색(간단히 키워드 검색) 등의 검색 기능을 자주 볼 수 있습니다. 효율적인 ASP 기반 사이트 다중값 검색.
이 기사에서는 "다중 조건 퍼지 일치 검색"을 다루고 있습니다. 여러 조건을 이해하고 나면 단일 조건 검색은 매우 쉽습니다. 일반적으로 다중 조건 검색에는 열거형(enumeration) 방식과 점진적(progressive) 방식의 두 가지 방법이 있습니다. 검색 조건이 너무 많지 않은 경우( n <=3), 문장의 빈도는 2의 n승 이며, n 은 조건 수만큼 증가합니다. 물론, 조건의 수가 증가할 경우에는 프로그램의 효율성이나 구현 가능성에 관계없이 점진적인 방법을 채택해야 하며 명령문 빈도는 n 이며 선형적으로 증가합니다. 열거 방법의 아이디어는 매우 간단하다는 점을 지적해야 합니다. 조건이 비어 있는지 여부를 하나씩 확인한 다음 비어 있지 않은 조건에 따라 검색하는 동시에 진리표 기술을 사용할 수 있습니다. 조건이 매우 많은 상황을 처리하는 데 사용됩니다(아무도 이런 일을 하지 않을 것이라고 믿습니다). 4가지 조건이 있는 경우 16개의 진술 그룹을 작성해야 합니다. 이해에 초점을 맞춘 진보적 방법이 더 독창적입니다. 첫 번째는 플래그(flag)를 사용하는 것이고, 두 번째는 SQL 기호&에서 문자열 연결을 영리하게 사용하는 것입니다. 다음은 엔진의 구축을 예시를 통해 설명합니다.
2. 예:
주소록 쿼리 엔진을 구축합니다. 데이터베이스 이름은 addressbook.mdb이고 테이블 이름은 address이며 필드는 다음과 같습니다.
ID | 이름 | 전화 | 학교 |
1 | Zhang San | 33333333 | 중국 전자 과학 기술 대학교 컴퓨터 공학과 |
2 | Li Si | 44444444 | 쓰촨 대학교 생물학과 |
3 | Wang Er | 22222222 | 서남 교통 대학교 건축학과 |
… | … | … | … |
웹 검색 인터페이스는 다음과 같습니다.
열거 방식을 사용한 소스 프로그램은 다음과 같다.
<%@ CODEPAGE = "936" %>
'데이터베이스에 연결
<%
희미 conn
희미 DBOath
희미 rs
희미 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
희미 Tel
희미 School
Name=request("Name")
Tel=request("Tel")
School=request("School")
'열거 방식의 검색 핵심, 세 가지 조건이 있으므로 if 판단문 8조를 작성해야 합니다.
if Trim(Name)="" and Trim(Tel)="" and Trim(School)="" then
sql="select * from address order. by ID asc"
end if
if Trim(Name)= "" and Trim(Tel)="" and Trim(School)<>"" then
sql="select * from address from School like '%"&trim(School)& "%' order by ID asc"
end if
if Trim (Name)="" and Trim(Tel)<>"" and Trim(School)="" then
sql="select * from address from address like '%"&trim (Tel)&"%' order by ID asc"
end if
if Trim(Name)="" and Trim(Tel)<>"" and Trim(School)<>"" then
sql="select * from address from Tel where Tel like '%"&trim(Tel)&"%' and School like '%"&trim(School)&"%' order by ID asc"
end if
if Trim(Name)<>"" and Trim(Tel)="" and Trim(School)="" then
sql=" select * from address from '%"&trim(Name)&"%' order by ID asc"
end if
if Trim(Name)<>"" and Trim(Tel )="" and Trim(School)<>" " then
sql="'%"&trim(Name)&"%'와 같은 이름 및 '%"&trim(School)&"%'와 같은 학교 순서가 있는 주소에서 *를 선택합니다. by ID asc"
end if
if Trim(Name)< >"" and Trim(Tel)<>"" and Trim(School)="" then
sql="select * from address from name like '%"&trim(Name) &"%' 및 Tel like '%"&trim( Tel)&"%' order by ID asc"
end if
if 트림(이름)<>"" 및 트림(전화)<>"" 및 트림(학교)<> "" 그런 다음
sql="이름은 '%"&trim(Name)&"%', 전화는 '%"&trim(Tel)&"%', 학교는 '%"&trim(School)&"과 같은 주소에서 *를 선택하세요. %' order by ID asc"
end if
rs.open sql,conn,1,1
'검색 결과 표시
if rs.eof 및 rs.bof then
response.write "현재 주소록에 레코드가 없습니다."
else
do while not rs.eof
response.write "이름:"&rs("이름" )&"전화:"&rs("전화")&"학교:"&rs("학교")&"<br>"
rs.movenext
루프
종료 if
'데이터베이스 연결 끊기
세트 rs=nothing
conn.close
set conn=nothing
%>
위 프로그램을 이해할 때 핵심 부분에 집중하세요. 8개의 문장 그룹은 3개의 검색창에 있는 8개의 상태에 하나씩 대응됩니다.
이름 | 전화번호 | 학교 |
| |
비어 있음 | | 비어 | 있음 비어 있음 비어 | 있음 비어 |
있음 비어 있음 비어 있음 비어 있음 비어 있음 | 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 | 있음 비어 있음 비어 있음 |
| 비어 있음 | 비어 있음
비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 있음 비어 | 않음 |
비어 | |
또한, Trim()은 입력 문자열 앞뒤의 공백을 제거하는 VB 함수인데, %는 SQL 언어에서 다중 문자 와일드카드(_는 단일 문자 와일드카드)이므로 %"라는 것을 알 수 있습니다. &trim()&"%는 검색 상자에 매우 유용합니다. 에 입력된 키워드는 각각 왼쪽에서 오른쪽으로 일치합니다. SQL 언어에서는 연결이 비어 있지 않은 조건 사이에 "AND" 관계가 있음을 나타내는 데 사용됩니다.
열거형 방식과 비교하면 핵심적인 부분만 다르다:
'진행형 방식의 검색 핵심은 조건이 비어 있지 않은지 판단하는 것이다. 검색 조건
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&" and Tel like '%"&Tel&"% '"
flag=1
elseif Tel<>"" then
sql=sql&" Tel like '%"&Tel&"%'"
flag=1
end if
if Company<>"" and 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
진행 방식은 문장의 길이만으로도 알 수 있듯이 스마트 알고리즘입니다. 이 알고리즘의 어려움과 본질은 플래그와 &에 있습니다. 우선, &는 SQL의 문자열 연결 기호로 기호 주위의 문자를 함께 연결한다는 점을 알아야 합니다. 다시 프로그램으로 돌아가서, Name이 비어 있지 않으면 sql="select * from address where Name like '%"&Name&"%' "그리고 flag=1, Name이 비어 있지 않고 Tel이 비어 있지 않으면, 즉 Tel<>"" 및 플래그=1, sql="'%"&Name&"%'와 같은 이름과 '%"&Tel&"%'와 같은 Tel이 있는 주소에서 *를 선택하고 플래그=1인 동안, 그렇지 않으면 이름이 비어 있는 경우 Tel Not 비어 있음, sql="select * from address from Tel like '%"&Tel&"%' " 및 flag=1 등, n 조건으로 검색하도록 확장될 수 있습니다. 물론 조건이 모두 비어 있는 경우, 즉 flag=0이면 모든 테이블의 모든 항목이 선택됩니다.
3. 확인하다:
이 시점에서 검색 엔진이 설정됩니다. 다음은 몇 가지 사용 예입니다.
검색 결과는 다음과 같습니다.
이름: Zhang San 전화: 33333333 단위: 중국 전자 과학 기술 대학 컴퓨터 과학과
검색 결과는 다음과 같습니다.
이름: Zhang San 전화: 33333333 단위: 중국 전자 과학 기술 대학 컴퓨터 과학과
이름 Li Si 전화: 44444444 단위: 쓰촨 대학교 생물학과
이름: Wang Er 전화: 22222222 단위: 서남교통대학교 건축학과
이름: | 전화: 4444 | 학교: 사천 | 검색 버튼 |
검색 결과는 다음과 같습니다.
이름 Li Si 전화: 44444444 단위: 쓰촨대학교 생물학과
이름 : | 전화번호 : | 학교 : Pay% 큰 | 검색버튼 |
검색 결과는 다음과 같습니다.
이름: Wang Er 전화: 22222222 단위: 남서교통대학교 건축학과
4. 개선하다:
실제로 이 엔진에는 여전히 몇 가지 결함이 있습니다. 문제는 주로 와일드카드 문자 %에 있습니다. 한편으로는 사람들이 *를 와일드카드 문자로 사용하는 데 익숙하기 때문입니다. 반면에 %가 하이퍼링크에 나타나면 다음과 같이 요청을 통해 %를 "먹습니다".
--test.htm--
…
<a href=test.asp?content=test%the%sign>여기를 클릭하세요</a>
…
--test.asp--
<%
콘텐츠=요청("콘텐츠")
응답.내용 쓰기
%>
IE에서 test.htm을 검색할 때 하이퍼링크를 클릭하면 다음과 같이 표시됩니다.
시험하다
하이퍼링크에서는 %가 직접 무시되는 것을 볼 수 있습니다. 이 문제를 어떻게 해결할 수 있나요? 아주 간단합니다. 약간의 트릭을 사용합니다. 빔을 뒤집고 기둥을 바꾸는 것입니다.
검색 코어 앞에 다음 코드를 추가합니다.
이름=교체(이름,"*","%")
Tel=replace(전화,"*","%")
회사=교체(회사,"*","%")
검색 코어 뒤에 다음 코드를 추가합니다.
이름=교체(이름,"%","*")
Tel=replace(전화,"%","*")
회사=교체(회사,"%","*")
이 진술을 분석해 봅시다. replacement()는 VB의 문자열 대체 함수입니다. replacement(Name,"*","%")는 Name의 모든 *를 %로 바꾸는 것입니다. 즉, 세 가지 조건에서 *의 모든 항목을 %로 대체하여 처음 세 문장의 와일드카드 문자가 *로 변경됩니다. 다음 세 문장은 %가 "먹히는" 것을 방지할 수 있습니다. 모든 문제가 해결될 것입니다.
이름 : | 전화번호 : | 학교 : Pay% 큰 | 검색버튼 |
검색 결과는 다음과 같습니다.
이름: 왕얼 전화: 22222222 단위: 서남교통대학교 건축학과
위의 문장을 다시 바꿔서 *를 공백으로 바꾸면 구글과 바이두에서 검색조건을 구분하기 위해 흔히 공백을 사용하는 검색엔진이 되지 않을까요?