티스토리 뷰
이 글은 설치하는 방법은 다른 블로그에 좋은 글이 많기 때문에 다루지 않고 실제 어떻게 적용을 했는지 만을 다룬다.
solr 는 apache의 enterprise search engine으로 빠른 검색 시스템을 제공해 주고 관리화면을 제공해주며 검색 쿼리를 http get을 사용하여 호출하기 때문에 기존 시스템에 적용하기 좋다. 또한 DIH(Data Import Handler) 를 사용하여 원천 데이터로 부터 검색에 필요한 데이터을 추출하여 solr에 저장할 수 있다. 나는 회사에서 제공하는 많은 디자인을 사용자에게 검색을 통해 제공할 수 있도록 DB검색을 solr 로 전환하는 작업을 했다.
처음 구조를 잡을 때 가장 고민했던 것은 검색하려는 목표와 목표를 검색하는데 필요한 데이터들의 분리였다. 목표란 프론트에서 검색 후 보여지는 항목 중 하나를 나타내는 데이터들 이고 이 데이터를 저장하는 테이블을 따로 만들었다.(실제로 테이블 이름을 search_goal 이라고 했다;;) 이렇게 분리한 이유는 검색의 목표는 자주 변하지 않지만 검색방법은 언제든지 리스크 없이 변경하기 위해서 였다.
하지만 실제로 이 구성을 해보니 너무 복잡했다. 2번의 변환 작업이 필요한데 검색 후 결과로 전달할 데이터들을 만드는 작업(search_goal 테이블에 데이터를 저장하는 작업), 그리고 검색에 필요한 데이터 + 검색 결과를 DIH 로 만드는 작업이다. 검색 결과를 쉽게 만들 수 있다면 search_goal 과 같은 테이블을 만들지 않고 DIH 만 사용하는 것을 추천한다. 나의 경우는 응답으로 전달할 데이터가 DIH 로 소화하기 힘들 정도의 쿼리가 필요하여 분리했다.
search_goal 테이블은 데이터들의 크게 구분하기 위한 category 컬럼 (예를 들어 고객이라면 customer, 디자인이라면 design) 그리고 category 안에서의 category_id (고객이라면 고객 아이디) 만들었고 category + category_id 를 유니크 인덱스로 만들었다.(테이블 전체에 대한 id 컬럼은 따로 만들었다.)그리고 검색의 결과로 보내줄 값들을 document 컬럼을 만들어 json 형태로 저장했고 검색결과는 document의 리스트가 프론트로 전달될 수 있도록 했다. 그리고 중요한 컬럼중 하나인 마지막 업데이트 시간을 기록하는 update_time 컬럼을 만들었는데 이는 나중에 DIH delta import 에 사용된다.
고객이 search_goal 에 저장될 때는
id : 1 (search_goal 의 pk)
category : customer (범위는 알맞게 정해준다)
category_id : 201938473abcd (고객ID)
document : {"name":"권성민", "email":"kwon-s-m@hanmail.net", "address":"대한민국"} (json 문자열로 저장)
update_time : 2018-05-27 09:09:09 (sysdate)
DIH
DIH 는 Data Import Handler 로 DB 로 부터 데이터를 추출해서 solr 도큐먼트로 저장해 주는 기능이다. xml 에 쿼리를 작성해서 사용하며 필요할 경우 javascript 를 사용하여 DB 의 내용을 내맘데로 가공할 수 있다. (https://wiki.apache.org/solr/DataImportHandler)
우선 DIH 로 상용할 xml 파일을 설정에 추가해 준다.
(https://wiki.apache.org/solr/DataImportHandler#Design_Overview)
기본은 jdbc 이며 mongo db와 같이 다른 repository 에서도 데이터를 가져올 수 있다. 간단하게 data source 설정을 추가해 준다. name 을 사용하면 이 후 query 를 사용하는 entity 에서 원하는 data source 를 선택할 수 있다.
https://wiki.apache.org/solr/DataImportHandler#Usage_with_RDBMS
full import
delta import
TIP
주의사항
'IT > 개발' 카테고리의 다른 글
Spring + JWT (0) | 2018.08.31 |
---|---|
객체지향 이란 (0) | 2018.06.10 |
Redis HA (0) | 2018.04.05 |
Github 에 개인 maven repository 생성하기 (0) | 2018.02.14 |
Garbage Collection (0) | 2017.02.04 |