반응형
검색 결과 강조
각종 검색엔진을 이용하여 검색 결과를 보면 내가 입력했던 검색어가 강조되어 표시되는 것을 볼 수 있습니다.
우리가 만든 검색 결과 페이지에 적용할 순 없을까요?
Solr는 이 Highlighting 기능을 지원하고 있습니다.
지금까지 그랬던 것처럼 아주 간단한 방법으로 구현할 수 있는데요.
오늘은 이 Highlighting 기능을 확인해보겠습니다.
Highlighting 적용
- 기존의 표 방식의 결과 페이지에는 본문 조각을 표시하기가 좋지 않습니다.
src/main/webapp/WEB-INF/jsp/board4/boardSearch.jsp 파일을 아래와 같이 변경해주세요.<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>board4</title> <script> function fn_formSubmit(){ document.form1.submit(); } </script> <style> em { font-weight: bold; } </style> </head> <body> <form id="form1" name="form1" method="post"> <div> <input type="text" name="q" style="width:150px;" maxlength="50" value='<c:out value="${q}"/>' onkeydown="if(event.keyCode == 13) { fn_formSubmit();}"> <input name="btn_search" value="검색" class="btn_sch" type="button" onclick="fn_formSubmit()" /> </div> </form> <h1>검색 결과</h1> <c:forEach var="listview" items="${listview}" varStatus="status"> <c:url var="link" value="board4Read"> <c:param name="brdno" value="${listview.id}" /> </c:url> <h3>[<c:out value="${listview.id}"/>] <a href="${link}"><c:out value="${listview.title}"/></a></h3> <h5>by.<c:out value="${listview.writer}"/></h5> <p>... <c:out value='${snippets.get(listview.id).get("text").get(0)}' escapeXml="false" />...</p> </c:forEach> </body> </html>
검색 결과에 검색어를 강조하기 위해 src/main/java/gu/board4/board4Ctr.java 파일의
boardSearch() 메소드를 아래와 같이 변경해주세요.@RequestMapping(value = "/board4Search") public String boardSearch(HttpServletRequest request, ModelMap modelMap) throws Exception { String q = request.getParameter("q"); if(!"".equals(q)) { SolrQuery query = new SolrQuery(); query.setQuery("text:" + q); query.setParam("hl.fl", "*"); query.setHighlight(true).setHighlightSnippets(1); QueryResponse responseSolr = SolrJDriver.solr.query(".", query); SolrDocumentList results = responseSolr.getResults(); Map<String, Map<String, List<String>>> snippets = responseSolr.getHighlighting(); modelMap.addAttribute("q", q); modelMap.addAttribute("listview", results.toArray()); modelMap.addAttribute("snippets", snippets); } return "board4/boardSearch"; }
- 아래 검색 페이지에서 다시 검색을 해보고 변경된 결과 페이지를 확인해주세요.
http://localhost:8080/board/board4Search
개념 안내
- query.setParam("hl.fl", "*")
강조할 필드의 목록을 정의하는 hl.fl 파라미터를 Query에 추가합니다.
hl.fl은 HighLighting.FieldList의 약자라는걸 이해하면 좀 더 알아보기 쉬울겁니다.
이번 예제에서 쓰인 *은 모든 필드를 대상으로 삼는다는 의미입니다. - query.setHighlight(true).setHighlightSnippets(1)
Snippet은 결과에 보여줄 본문 조각입니다.
따라서 이 코드는 검색결과 강조 기능을 활성화하고, 보여줄 결과 조각은 1개만 가져온다는 의미입니다.
뒤에 1을 2, 3과 같이 설정하여 여러 조각을 가져오도록 설정할 수 있습니다. - responseSolr.getHighlighting()
이 메소드는 Map 객체를 반환합니다.
반환된 Map 객체의 데이터는 아래와 같은 구조로 이루어져 있습니다.
{DOCUMENT_ID:{FIELD:[SNIPPET, SNIPPET, ...], FIELD:[...], ...}, DOCUMENT_ID:{...}, ...}
즉 결과를 담은 객체 이름을 snippets라고 했을 때 아래와 같이 접근할 수 있습니다.
snippets.get("BRD001").get("CONTENTS").get(0);
이 코드는 ID가 BRD001인 게시글에서 내용(CONTENTS)과 관련된 첫 번째 결과 조각을 얻게 됩니다. - 강조 표현
검색 결과를 강조하는 태그는 solrconfig.xml에 기본값이 지정되어 있습니다.
기본값은 <em /> 태그로 감싸도록 설정되어 있고 때문에 이번 예제에서는 em을 굵게 표시하는 CSS가 적용되어 있습니다.
수고 많으셨습니다.
Solr 빠른 완성 시리즈의 기술적인 내용은 이번 편에서 완료되었습니다.
지금까지 총 6편의 글을 통해서 여러분들은 Solr에 색인 문서를 추가하고, 수정, 삭제하는 방법을 알아보셨으며,
색인된 문서를 검색하고, 검색어를 강조하여 표시하는 방법까지 확인하셨습니다.
지금 바로 여러분만의 검색엔진을 만드실 수 있습니다!
Solr 빠른 완성 시리즈의 기술적인 내용은 이번 편에서 완료되었습니다.
지금까지 총 6편의 글을 통해서 여러분들은 Solr에 색인 문서를 추가하고, 수정, 삭제하는 방법을 알아보셨으며,
색인된 문서를 검색하고, 검색어를 강조하여 표시하는 방법까지 확인하셨습니다.
지금 바로 여러분만의 검색엔진을 만드실 수 있습니다!
다만 아직 여러분의 Solr는 한국어를 이해하지 못합니다.
다음편에서는 한국어 형태소 분석기를 적용하는 방법을 연재하겠습니다.
다음편에서는 한국어 형태소 분석기를 적용하는 방법을 연재하겠습니다.
X. 한국어 형태소 분석기 적용 > |
내용에 있는 오류나 질문은 댓글을 달아주세요.
반응형