2015년 11월 26일 목요일

5. Classic ASP + Solr 연동

1. 혹시 모를까봐 알려주는데 query문 테스트는 solr 관리자 query에서 하는건 알지?

2. 이번엔 서비스를 준비해 보자.
 <%
Session.CodePage = 65001
Response.ContentType = "application/json"
Response.Charset = "utf-8"
 
sMode = Request.QueryString("sMode") '@sMode int, --0:전체, 1:도서명.......
if sMode = "" then sMode = 0
sMode2 = Request.QueryString("sMode2")
searchCol = "prma_name"
 
Select Case sMode
 Case 0123
  searchCol = "search_prma_name"
        ...
End Select
 
catLimit = ""
Select Case sMode
 Case 1,4,5,6
  catLimit = "A"
 ...
End Select
 
addSKey = ""
sKey = Request.QueryString("sKey")
sKeyLen = LEN(sKey)
 
if cfnChkSpecialChr(sKey) >0 And sKeyLen = 1 Then Response.End()  '특수문자 1글자 들어오면 검색 중단'
 
chkPlace = 0
chkPlace = INSTR(sKey, "(")   '특수문자 입력시에 체크함'
limitLen = 0
if chkPlace > 0 then
 addSKey = Mid(sKey, chkPlace, Len(sKey))  '특수문자 이후의 글자만 추출'
 limitLen = Len(addSKey)
end if
 
sKey = cfnEscapeStr(sKey)
sKeyOrigin = sKey
 
spaceChk = Split(sKeyOrigin," ")  '공백이 들어간 입력 체크'
Dim spaceDim
ReDim spaceDim(UBound(spaceChk))
cnt = 0
For Each item In spaceChk
 spaceDim(cnt) = spaceQuery & ".?" & item & ".?"
 cnt = cnt + 1
Next
 
sKeyOrigin = Server.URLEncode(sKeyOrigin)
 
if chkPlace < 0 then addSKey = sKeyOrigin
 
sKey = Replace(sKey, " """)
sKey = Server.URLEncode(sKey)
 
addSKey = cfnEscapeStr(addSKey)
addSKey = Server.URLEncode(addSKey)
 
sKey2 = Request.QueryString("sKey2")
 
nRowCnt = Request.QueryString("nRowCnt")
if nRowCnt = "" then nRowCnt = 10
 
nReqPage = Request.QueryString("nReqPage")
 
= Request.QueryString("j")
if j = "" then j = 1
 
dist1 = Request.QueryString("dist")
dist2 = ""
 
ord = Request.QueryString("ord") '--검색정렬 순 0:등록순, 1:판매순, 2:가격순, 99:초기검색(score)'
sortOpt = Request.QueryString("sortOpt")
if ord = "" then ord = 99
ordColNm = "prma_pcode+desc"
Select Case ord
 Case 0
  ordColNm = "입력일 "
 Case 99
  ordColNm = "score "
End Select
 
if sortOpt = "0" then
 ordColNm = ordColNm & "desc"
else
 ordColNm = ordColNm & "asc"
end if
 
ordColNm = ordColNm & ",pcode desc"
 
Dim HttpReq
Dim Diamond
Set HttpReq = Server.CreateObject("Msxml2.ServerXMLHTTP.6.0")
 
urlParam = ""
fliterStr = "&fq=-prma_jeco:8 AND -ls_code:T"
 
if sKey <> "" then 
 if sMode=0 OR sMode=1 OR sMode=2 OR sMode=3 then  
  urlParam = urlParam & "?q=((search_pname:(" & skey & "* or """ & skey & """ or """ & sKeyOrigin & """)) OR ("
  for i = 0 to UBound(spaceDim) '공백 넣었을때 처리.. 각각 분리해서 키값으로 연산..'
   urlParam = urlParam & "pname:/"&Server.URLEncode(spaceDim(i))&"/ AND "
  next
  urlParam = Left(urlParam, Len(urlParam)-4) & ""
  if limitLen = 2 then urlParam = urlParam & " OR pname:/.?"&addSKey&".?/"
  urlParam = urlParam & ")" 
  if limitLen = 2 then urlParam = urlParam & " OR pname:"&Replace(sKeyOrigin, "("" (")&""  
  urlParam = urlParam & ")" 
 else
  urlParam = urlParam & "?q="& searchCol & ":" & skey & ""  
 end if
end if
 
if sKey2 <> "" then
 if sMode2 = 1 OR sMode2 = 0 then
  urlParam = urlParam & " AND (search_pname:(" & skey2 & "* or """ & skey2 & """ or " & sKeyOrigin2 & ")"& " OR search_pname:" & sKeyOrigin2 & "*)"
 else
  urlParam = urlParam & " AND "& searchCol2 & ":(" & skey2 & "* or """ & skey2 & """ or " & sKeyOrigin2 & ")"
 end if
end if
 
if j <> "-1" then
 if j = "1" then
  fliterStr = fliterStr & " AND 재고:1"
 else
  fliterStr = fliterStr & " AND 재고:0"
 end if
end if
 
if dist1<> "" then fliterStr = fliterStr & " AND 대분류:" & dist1
 
if dist2<> "" then fliterStr = fliterStr & " AND 중분류:" & dist2
 
rowStr = "&start="&((nReqPage-1) * nRowCnt)&"&rows="&nRowCnt
sortStr = "&sort=" & ordColNm
optStr = "&wt=json&indent=true&defType=edismax&stopwords=true&lowercaseOperators=true&q.op=AND"
 
url = "검색서버주소/solr/lifebook/select" & urlParam
url = url & optStr
url = url & fliterStr
url = url & sortStr
url = url & rowStr
 
if UCASE(Request.QueryString("d")) = "T" then    '디버깅용 코드'
 Response.Write(url)
 Response.End()
end if
 
HttpReq.open "GET", url, False
HttpReq.send
 
Response.Write HttpReq.responseText
 
Function cfnEscapeStr(chkKey)
 chkKey = Replace(chkKey, "\""\\")
 chkKey = Replace(chkKey, "+""\+")
 chkKey = Replace(chkKey, "-""\-")
 chkKey = Replace(chkKey, "&&""\&&")
 chkKey = Replace(chkKey, "||""\||")
 chkKey = Replace(chkKey, "!""\!")
 chkKey = Replace(chkKey, "(""\(")
 chkKey = Replace(chkKey, ")""\)")
 chkKey = Replace(chkKey, "{""\{")
 chkKey = Replace(chkKey, "}""\}") 
 chkKey = Replace(chkKey, "[""\[")
 chkKey = Replace(chkKey, "]""\]")
 chkKey = Replace(chkKey, "^""\^")
 chkKey = Replace(chkKey, Chr(34)"\" & Chr(34))
 chkKey = Replace(chkKey, "~""\~")
 chkKey = Replace(chkKey, "*""\*")
 chkKey = Replace(chkKey, "?""\?")
 chkKey = Replace(chkKey, ":""\:")
 cfnEscapeStr = chkKey
End Function
 
Function cfnChkSpecialChr(chkKey)
 Dim chkSpChar(17)
 chkSpChar(0) = "\"
 chkSpChar(1) = "+"
 chkSpChar(2) = "-"
 chkSpChar(3) = "&&"
 chkSpChar(4) = "||"
 chkSpChar(5) = "!"
 chkSpChar(6) = "("
 chkSpChar(7) = ")"
 chkSpChar(8) = "{"
 chkSpChar(9) = "}"
 chkSpChar(10) = "["
 chkSpChar(11) = "]"
 chkSpChar(12) = "^"
 chkSpChar(13) = """"
 chkSpChar(14) = "~"
 chkSpChar(15) = "*"
 chkSpChar(16) = "?"
 chkSpChar(17) = ":"
 rtnCnt = 0
 For tmp = 0 To UBound(chkSpChar)
  if Instr(chkKey, chkSpChar(tmp)) then
   rtnCnt = rtnCnt + 1
  end if
 Next
 cfnChkSpecialChr = rtnCnt
End Function
%>


2.1. 코드를 보면 최상단에 문자셋을 유니코드로 설정을 해주는게 있다. json을 사용해서 주고 받기에 컨텐츠 타입도 json으로 설정함.

2.2. 필터로 사용될 조건과 검색어로 들어갈 조건을 구분해서 잘 작성하도록..

2.3. 희안하게 공백을 넣었을때랑 안 넣을때랑 차이가 많이 나서 OR로 결과를 붙이는 방식으로 접근했다.

2.4. 특수문자 사용시에는 "회심(폴" 과 "회심 (폴"의 결과가 달라서 특수문자가 들어가면 특수문자 앞을 띄워줘서 결과를 OR로 결합을 했다.

2.5 특수문자 + 1글자만 사용해도 결과가 잘 안나와서 OR로 결과를 붙여왔다.

2.6. 질의어는 와일드카드(*)는 질의어의 LIKE와 동일함

2.7. 더블쿼테이션("")으로 감싸면 포함된 단어 검색

2.8. 슬래쉬(/)로 감싸면 정규식 사용이다. 그냥 일반적으로 /.?검색어/?/ 형식으로 사용했다.

2.9 검색어에 포함되는 특수문자는 당연히 공통 함수로 escape 처리해버렸음.

2.10. solr 관리자에는 안 보이는 항목인데 q.op 옵션으로 기본 검색 질의 결과를 OR이나 AND로 조절할 수 있다. 정확한 결과를 출력하기 위해 AND로 값을 지정했다.

2.11. 검색어는 Server.URLEncode(sKey)로 인코딩을 반드시 해 줘야 한다!

2.12. 3달동안 짠거라... 안 쓰는 값도 있을 수 있다.. 알아서 빼고 보셈.

3. 결과를 만드는 화면은 json 처리 하는 거라 굳이 안 만들겠음.. 혹시 나중에 내가 필요하면 추가 작성

4. 끗.... 개고생 그만하고 싶다..

댓글 없음:

댓글 쓰기

BE Band (비밴드) - 2024년 03월 02일 잠실새내 락앤롤욱스 공연

나의 10~20대를 보낸 잠실에서의 공연.. 오랜만에 가보니.. 여기가.. 마눌님과 자주 가던 영화관이었는데... 여긴 뭐가 있었는데... 란 추억도 떠올리며 기분좋게 감.​ 공연장은 좀 협소한 편이었고, 인천의 쥐똥나무 보다는 약간 크고... 인천 ...