1. 혹시 모를까봐 알려주는데 query문 테스트는 solr 관리자 query에서 하는건 알지?
2. 이번엔 서비스를 준비해 보자.
<%
Session.CodePage = 65001Response.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 0, 1, 2, 3 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") j = 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. 끗.... 개고생 그만하고 싶다..
댓글 없음:
댓글 쓰기