티스토리 뷰

IT/개발

레거시에 Solr 적용하기

K.Nero 2018. 5. 22. 12:22

이 글은 설치하는 방법은 다른 블로그에 좋은 글이 많기 때문에 다루지 않고 실제 어떻게 적용을 했는지 만을 다룬다.

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

처음 한 번은 전체 데이터를 가져와야 하기 때문에 full import 를 사용하여야 한다. DIH는 xml 에 안의 document element 안에서 entity 객체를 기준으로 쿼리를 수행하고 결과물을 만든다. 그리고 full import 는 각 document 안의 entity 의 query attribute 에 설정된 쿼리를 사용한다.

전체를 수행하는 만큼 시간이 오래 걸린다. 
entity 는 하위 entity 를 구성할 수 있는데 document 아래의 entity 가 solr document 가 되고 document 구성을 할 때 다른 여러 테이블의 데이터가 필요할 경우 상위 entity 의 결과물의 값을 하위 entity query에서 사용하여 다른 테이블을 검색하고 그 결과를 document 에 추가할 수 있다.
(예제의 xml에 잘 구성되어 있다.)

delta import

delta import 는 마지막 import 를 수행한 후 변경사항에 대해서만 import 를 수행하는 것으로 entity 안에 deltaQuery, deltaImportQuery 를 추가해서 사용한다. 

deltaQuery의 결과는 schema.xml 에 지정된 document 의 pk 이어야 하며 이 값은 deltaImportQuery 로 전달되어 import 가 수행된다. 
예제의 ${dih.last_index_time} 이 마지막에 import 가 수행된 시간이며 이보다 후에 값을 가진 data 를 검색하고 그 검색 결과가 ${dih.delta.id} 에 전달되어 import 를 수행하게 된다.
last_index_time 의 설정은 아래 블로그를 참고하자

TIP

DIH 의 가장 자주 사용하게 되는 기능은 debug 기능이다.(이거 모를 때는 파일 수정하고 reload 를 수 없이 반복했다.) xml을 수정하고 바로 실행하면 결과가 나오는데 결과에 아무런 document가 나오지 않는다면 logging 으로 이동하여 에러로그를 확인해 보자.

나는 각 document 의 가중치를 주기 위해서 사람들이 많이 사용한 단어들을 document 에 여러 개 세팅해 주었다. 이 작업은 DIH 에 javascript 를 사용하였다.
entity 이 결과 row 가 함수로 전달되고 함수의 반환값이 solr document 에 포함되게 된다. javascript 의 결과에 해당하는 값들의 key 값도 schema.xml 에 타입이 정의되어 있어야 하며 entity 밑에 field 는 설정하지 않아도 된다.

주의사항

1. document 의 하위 element 들 중 <field column="NAME" name="name" /> 가 최종적으로 solr document 에 저장되는데 name 의 값이 conf/schema.xml 에 타입이 저장되어 있지 않다면 document에 아주 자연스럽게 포함되지 않는다. (https://wiki.apache.org/solr/DataImportHandler#Schema_for_the_data_config

2. solr core 를 만들기 전 미리 파일들을 복사해 두지 않으면 에러가 난다. (이거 때문에 삽질을 많이 했다...) default conf 폴더를 만들려는 코어 이름의 폴더를 만들고 밑에 복사해 두자.

3. schema.xml 에 자신이 사용할  document 의 pk 를 지정해 주어야 한다. document 는 pk 를 포함해야 하고 이 pk 의 타입이 schema.xml 에 있어야 한다.


'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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함