jetalog.net

검색 결과 강조


각종 검색엔진을 이용하여 검색 결과를 보면 내가 입력했던 검색어가 강조되어 표시되는 것을 볼 수 있습니다.

우리가 만든 검색 결과 페이지에 적용할 순 없을까요?


Solr는 이 Highlighting 기능을 지원하고 있습니다.

지금까지 그랬던 것처럼 아주 간단한 방법으로 구현할 수 있는데요.


오늘은 이 Highlighting 기능을 확인해보겠습니다.


Highlighting 적용

  1. 기존의 표 방식의 결과 페이지에는 본문 조각을 표시하기가 좋지 않습니다.
    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>


  2. 검색 결과에 검색어를 강조하기 위해 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";
        }
  3. 아래 검색 페이지에서 다시 검색을 해보고 변경된 결과 페이지를 확인해주세요.
    http://localhost:8080/board/board4Search

개념 안내

  1. query.setParam("hl.fl", "*")
    강조할 필드의 목록을 정의하는 hl.fl 파라미터를 Query에 추가합니다.
    hl.flHighLighting.FieldList의 약자라는걸 이해하면 좀 더 알아보기 쉬울겁니다.
    이번 예제에서 쓰인 *은 모든 필드를 대상으로 삼는다는 의미입니다.

  2. query.setHighlight(true).setHighlightSnippets(1)
    Snippet은 결과에 보여줄 본문 조각입니다.
    따라서 이 코드는 검색결과 강조 기능을 활성화하고, 보여줄 결과 조각은 1개만 가져온다는 의미입니다.
    뒤에 1을 2, 3과 같이 설정하여 여러 조각을 가져오도록 설정할 수 있습니다.

  3. responseSolr.getHighlighting()
    이 메소드는 Map 객체를 반환합니다.

    반환된 Map 객체의 데이터는 아래와 같은 구조로 이루어져 있습니다.
    {DOCUMENT_ID:{FIELD:[SNIPPET, SNIPPET, ...], FIELD:[...], ...}, DOCUMENT_ID:{...}, ...}

    즉 결과를 담은 객체 이름을 snippets라고 했을 때 아래와 같이 접근할 수 있습니다.
    snippets.get("BRD001").get("CONTENTS").get(0);
    이 코드는 ID가 BRD001인 게시글에서 내용(CONTENTS)과 관련된 첫 번째 결과 조각을 얻게 됩니다.

  4. 강조 표현
    검색 결과를 강조하는 태그는 solrconfig.xml에 기본값이 지정되어 있습니다.
    기본값은 <em /> 태그로 감싸도록 설정되어 있고 때문에 이번 예제에서는 em을 굵게 표시하는 CSS가 적용되어 있습니다.
수고 많으셨습니다.
Solr 빠른 완성 시리즈의 기술적인 내용은 이번 편에서 완료되었습니다.

지금까지 총 6편의 글을 통해서 여러분들은 Solr에 색인 문서를 추가하고, 수정, 삭제하는 방법을 알아보셨으며,
색인된 문서를 검색하고, 검색어를 강조하여 표시하는 방법까지 확인하셨습니다.

지금 바로 여러분만의 검색엔진을 만드실 수 있습니다!

다만 아직 여러분의 Solr는 한국어를 이해하지 못합니다.
다음편에서는 한국어 형태소 분석기를 적용하는 방법을 연재하겠습니다.



< 5. SolrJ를 이용한 검색

X. 한국어 형태소 분석기 적용 >


내용에 있는 오류나 질문은 댓글을 달아주세요.




저작자 표시 비영리 동일 조건 변경 허락
신고
댓글 로드 중…

트랙백을 확인할 수 있습니다

URL을 배껴둬서 트랙백을 보낼 수 있습니다