오픈소스 루씬(Lucene)을 기반으로 하는 대표적인 검색엔진인 Solr와 Elastic Search 중에서 

Elastic Search(이하 ES)가 더 폭넓게 사용되고, Solr는 다소(?) 위축된 것 같다.

이 사이트에 따르면 2012년 이후로 ES가 대세가 되었다고 한다.

온라인 서점에서 검색해 보면, ES 관련 서적은 매년 출판되어 2019년에도 몇 권이 출판되었다.
(Elastic Search, 엘라스틱서치, 일래스틱서치 등으로 검색)

Solr는 Solr 4 (최신 버전은 8) 버전이 2014년에 세 권 출판된 것이 전부다 (못 찾은 것일 수 있음).

 

하지만 일반적인 문서 검색은 Solr가 쉽게 구현할 수 있고, 웹 로그와 같은 소형 데이터는 ES가 좋다고 생각한다.

새로 이직한 회사에서 ES로 검색 서버를 구축하면서

외부 데이터를 검색 서버에 넣어주는(색인하는-Indexing) DIH (Data Import Handler) 관련 기술이 필요했다.

ElasticSearch는 Logtash를 이용해서 웹 로그나 메일 같은 외부 데이터를 쉽게 색인 할 수 있는데,

RDBMS의 Parent / Child 데이터를 처리하는 방법을 찾기 어려웠다.

게시판을 예로 들면, 게시글(Parent)과 댓글(Child)을 색인 하기 어려웠다. 

더욱이 첨부 파일이 있는 경우에는 게시글에 맞춰서 색인해야 하기 때문에 더 어려웠다.

방법을 찾던 중에 몇 년 전 교육 받은 Solr에서 쉽게 처리했던 기억이 났다.

같이 교육 받았던 직원이 며칠 만에 구현했다며 나에게 준 소스를 찾았다.

Solr에서는 쉬운 것이, ES에서는 자료를 첮지 못해 결국 색인 프로그램을 개발해야 했다.

 

찾은 자료를 정리하는 차원과 이 좋은 Solr도 많이 사용되길 바라면서 정리한다.

자세한 장단점은 이 사이트를(영어) 읽어보면 되고,

여기에서는 Solr를 쉽게 익히기 위해  Solr에서 제공하는 예제를 중심으로 정리한다.

Solr 예제는 Solr 사이트의 시작하기에 정리되어 있는데,

개인적으로 처음 시작하는 사람에게는 어려운 것 같아서 이 내용에 개인적인 해석을 넣어서 정리한다.

  1. 설치
  2. 기술제품과 검색식
  3. 스키마(Schema)
  4. DIH (Data Import Handler)

먼저 Solr 사이트에서 압축 파일을 다운 받아 압축을 풀어서 설치를 완료한다.

         http://lucene.apache.org/solr/downloads.html

이 글을 정리하는 시점에는 8.4.0버전이 최신 버전이고,

운영체제에 맞는 압축 파일(tgz/zip)을 받아서 사용하면 된다.

좀더 상세한 설명은 이전 블로그 글을 참고해도 되고, Solr 설치 매뉴얼을 참고 해도 된다.

 

압축 파일을 푼 다음,

다음 그림과 같이 콘솔 창에서 실행 파일이 있는 bin 폴더로 이동해서 

solr start를 입력해서 Solr를 실행한다.


경고 메시지는 일단 무시하고,

마지막의 “Started Solr server on port 8983.” 문장이 출력되면 

Solr 검색 엔진 서버가 잘 실행된 것이다.

웹 브라우저에서 8983포트로 접속해서 Solr 관리자가 잘 실행되는지 확인한다.

       http://localhost:8983

관리자 페이지에는 서버만 실행한 것이기 때문에 별다른 내용이 없다.

예제를 실행하면,

이 관리자 페이지에서 다양한 Solr 설정이나 기능을 확인할 수 있다.

 

예제에는 클라우드 예제를 먼저 정리하고 있는데, 여기에서는 클라우드 관련 내용은 정리하지 않는다.

서버나 네트워크 전문가가 아니라서 잘 모르는 것도 있고, 개인적으로 클라우드의 필요성을 잘 모르기 때문이다.

어느 정도 규모에 어떻게 적용할지를 모르면 낭비가 발생하고 (서버 규모 === 돈)

그냥 중소 규모의 기업에서 발생하는 데이터는 단독모드로 사용해도 된다고 생각한다.

더우기 검색 엔진을 잘 모르는데, 클라우드 등 다양한 개념이 시작하는 사람에게 도움이 되지 않는다고 생각하기 때문이다.

 

두 번째 예제인 기술상품(Index the Techproducts Data)부터 정리한다.

모든 예제는 설치 경로의 예제(example) 폴더에 있고, Solr 예제에서는 이 폴더의 내용을 지정해서 설치한다.

Solr 예제에 있는 방식으로 실행하면 오류가 발생한다.

데이터를 저장할 techproducts 코어를 생성하라는 설명 없이, 데이터를 저장하는 (post) 명령어만 설명되어 있다.

        solr create -c techproducts

따라서 콘솔에서 위와 같은 명령어를 실행해서 코어를 생성하고, 

Linux/Mac 일때는
        bin/post -c techproducts example/exampledocs/*

Windows는
        java -jar -Dc=techproducts -Dauto example\exampledocs\post.jar example\exampledocs\*

으로 실행하라고 한다.

여기에서 실행 경로는(example\exampledocs) Solr 설치 경로의 하위이지 bin 경로의 하위가 아니다.

각자 다르겠지만, 여기에서는 그림처럼 D:\dev\solr-8.4.0가 Solr 설치 경로이다.

앞서 코어를 생성한 것은 bin 폴더에서 실행한 것이니, 폴더 경로를 잘 맞추어 실행해야 한다.

Solr 설치 경로에서 작업할 경우에는 

        bin/solr create -c techproducts          <= Linux/Mac
        bin\solr create -c techproducts         <= Windows

처음에는 Solr 파일들을 보기 위해 bin에서 시작했고, 이후로는 편의를 위해 Solr 설치 경로를 기준으로 정리한다.

즉, solr start가 아닌 위와 같이 bin\solr start와 같이 정리한다.

그리고, 별도의 표시가 없으면 윈도우 기준으로 정리한 것이다.

 

코어를 생성하고, 데이터를 저장하는 (post) 명령어를 실행해면 뭔가 잘되는 것 같다가 오류가 발생한다.

example\exampledocs 폴더에는 XML 등 다양한 파일이 있는데, post.jar 등의 파일을 색인 할 수 없다는 오류 메시지가 출력된다.

명령어에서 모든 파일(example/exampledocs/*)을 색인 하라고 지정해서 발생한 것으로,

별도의 설정을 하면 되겠지만,

여기서는 빼고 example/exampledocs/*.xml로 수정해서 xml 파일만 색인 하도록 한다.

또는 example/exampledocs/*.json으로 바꿔서 한번 더 실행해도 된다.

 

문서에서 제시하는 방법으로 하지 말고, 다음과 같이 실행해도 된다.

먼저 실행 중 인 Solr가 있으면 다음 명령어로 중지한다.

            bin\solr stop –all

코어를 생성하지 않고 다음과 같이 예제를 실행하는 e 옵션으로 다시 실행한다.

           bin\solr start -e techproducts

기술 제품(techproducts) 예제를 실행하라는 명령어이다.

위 문장들을 읽어보면

techproducts 코어 (Created new core 'techproducts')를 생성하고

D:\dev\solr-8.4.0\example\exampledocs 폴더에 있는 XML 파일을 색인했다는 의미이다 (14 files indexed).

그리고, 마지막에 예제를 잘 실행했으니 관리자 페이지에서 결과를 확인하라고 출력한 것이다.

 

코어(core)는 색인한 데이터를 저장하는 장소로,

RDBMS로는 테이블, 엑셀로는 시트(sheet)와 비슷한 의미이다.

기술 제품을 저장할 코어(techproducts)를 생성하고, 14개의 XML 파일을 읽어서 이 저장소에 저장했다는 의미이다.

저장하다는 것을 검색 엔진에서는 색인 - Indexing 한다고 한다.

 

웹 브라우저로 관리자 페이지에 접속하면,

[Core Selector]에 생성한 techproducts 코어가 추가된 것을 확인할 수 있다.

이 코어를 선택하면,

다음 그림과 같이 하단에는 코어에서 사용할 수 있는 메뉴들이 나오고

우측에는 저장된 데이터 수(Num Docs), 저장된 데이터의 위치(data)등의 개요(Overview)가 출력된다.

기술 문서 데이터가 32건 저장된 것을 확인할 수 있다.

Replication(복제)은 데이터에 오류가 생겼을때 복구하기 위해 생성하는 것으로 기본 2개가 생성되어 있다.

복제도 클라우드와 마찬가지로 여기서 정리하지 않는다.

 

이 방법이 쉽고 간단한데, Solr를 껏다 켠 경우(solr start)  techproducts 코어가 없다고 나온다.

일반적으로 코어를 생성시키면 solr설치 경로\server\solr에 코어 이름으로 폴더가 생성된다.

bin\solr start -e techproducts로 코어를 생성한 경우, solr설치 경로\example에 코어가 생성된다.

따라서, 계속 bin\solr start -e techproducts로 실행해야 하는 단점이 있다.

어차피 예제는 몇번보고 말것이니 이렇게 사용해도 괜찮을 것 같다.

 

이상의 예제 설치 방법에서 처음 것은 Solr 예제 사이트에서 설명한 방식이고,

두 번째 간단한 것은 예제(example) 폴더의 README.txt 파일에 설명된 방식이다.

조금 부족하고 이상하지만 각자에 맞는 방식으로 연습하면 될 것 같다.

그리고, 선택한 방식에 따라 저장된 데이터의 개수에 차이가 있다.

여기서는 두 번째 방식(xml만 색인)으로 색인한 예제를 대상으로 정리한다.

 

코어를 선택하고 "Query" 메뉴를 클릭하면 다양한 데이터 조회(질의-Query)를 할 수 있는 화면(중앙부분)이 나타난다.

중앙부분 하단에 있는 파란 색 버튼 - Execute Query를 클릭하면,

다음 그림과 같이 우측에 저장된 기술 제품 예제 데이터가 Json 형태로 출력된다.

중앙 부분이 검색식을 입력하는 부분이고, 우측 부분은 실행 결과 화면이다.

우측 실행 결과 화면의 상단에 있는 URL을 클릭하면 

웹 브라우저의 주소가 해당 URL로 바뀌면서 다음 그림과 같이 실행된다.

              http://localhost:8983/solr/techproducts/select?q=*%3A*

이 결과는 이전 페이지의 JSon 결과와 같은 것으로,

Solr 검색을 URL로 실행할 수 있다는 것을 의미한다 (RESTful).

즉, URL의 내용을 수정해서 다른 웹브라우저나 탭, 프로그램curl, wget, PostMan등에서 사용할 수 있다.

 

URL의 내용을 정리하면,

http://localhost:8983/solr은 Solr 검색 엔진 서버 주소이고

techproducts는 데이터를 저장하는 코어

select는 데이터 조회를 의미한다.

q는 Query, 즉 검색식을 의미하며 *:* (%3A = : )

콜론(:) 앞의 *는 모든 필드를, 뒤의 *는 모든 값을 의미하는 것으로 모든 데이터를 조회한다는 의미가 된다.

(뒤의 * 대신에 찾고자 하는 값을 지정해서 실행하면, 모든 필드에서 지정한 값을 찾는 검색이 된다.)

저장된 데이터가 32건이니 모든 데이터는 32건이 출력될 것 같지만 10개만 출력된다.

전체 데이터를 조회하는 경우에는 알아서 10개만 반환된다.

 

이 URL은 앞서의 Query 화면에서 (http://localhost:8983/solr/#/techproducts/query)

Execute Query 버튼을 클릭하면서 자동으로 생성된 것으로,

"Query" 메뉴는 검색식을 잘 모르는 초보자들이 검색 조건을 쉽게 만들어서 테스트 해 볼 수 있는 메뉴이다.

개발자들이 각 검색 조건에 값을 지정하고 실행하면, 즉시 실행 결과를 확인할 수 있고

Java와 같은 개발 언어에서 RESTful로 호출해서 사용할 수 있는 URL을 알려주는 것이다.

위 그림에서 동그라미로 표시된 q *:*를 보면

좌측의 q *:*이 조건식을 입력한 것이고

우측 상단의 url이 Query 페이지에서 자동으로 생성된 실행 명령어(URL - q *:*)이고

우측 중앙에 있는 responseHeader에

Solr가 실행한 결과를 반환하면서 무엇을 실행했는지(params, q *:*)가 표시되어 있다.

 

response에 numFound가 찾은 전체 개수이고, start가 몇번째 것 부터 가지고 온 것인지 표시한 것이다.

좌측의 검색 조건 입력부분에서 start 값을 변경하면 response의 값도 동일하게 바뀐다.

즉, 검색한 데이터 중 몇 번째 부터(start), 몇 개(rows) 를 가지고 오라고 지정하는 것이다.

페이징(Paging)처리를 위한 것이다.

docs 다음의 배열( [ ] )은 찾은 데이터의 필드 이름과 필드 값들이 Json 형태로 출력된다.

id, name, features, price, price_c 등의 필드 값이 출력된다.

 

검색 조건들을 지정하는 부분에는 q, start, rows외에도 fq(Filter Query), Sort(정렬),  fl (반환할 필드 리스트), df (default search field 기본 검색 필드), wt (writer type 결과 표시 방법 Json, XML등) 등의 설정을 지정해서 검색 할 수 있다.

보다 자세한 내용은 Solr 문서를 읽어보길 바라고 (값 넣고 실행해 보면 대충 파악 가능), 다른 블로그에 정리된 내용을 참고 해도 된다.

여기에서는 Solr 예제와 관련된 내용을 중심으로 하나씩 정리할 예정이다.

 

 

+ Recent posts