기본 콘텐츠로 건너뛰기

[ SOLR ] Schema 에 기본 값 설정

  Solr 기반 검색 어플리케이션을 테스트하면서 재미있는 증상이 발견 되었다. 증상이라는 것이 일반적인 전체 데이터 조회 (q=*:*) 에서 Score 기반의 정렬에서는 특정 필드가 보이지만, 개별 필드에 대한 정렬 (sort=DueDate desc) 을 실행하면 특정 필드가 사라지는 현상이다.
 
  이런 현상 때문에 여러 가지 테스트를 진행하면서 원인을 파악하던 중에 Solr 에서는 값이 존재하지 않는 필드를 조회할 때 무시하는 상황이 존재한다는 것이다. 즉, 문서에 10개의 필드가 존재하고 전체 필드를 조회할 때 해당 문서에 A 라는 필드가 값이 없다면 이를 제외한 9개의 필드만 반환하는 상황이다.
 
  특정 필드처럼 보였던 이유는 MySQL 에서 Data Import 를 수행할 때 StartDate / EndDate / DueDate 의 일자 컬럼이 존재하는데 EndDate의 경우는 값이 존재하지 않을 수 있기 때문에 Solr 로 전달될 때 NULL 값이 전달되고, Solr 에서는 값이 NULL 이기 때문에 해당 문서에 EndDate를 처리하지 않는 상황인 것이다. 따라서 전체 데이터를 조회할 때는 Score 순서에 따라서 문서들이 보여지면서 EndDate 가 존재하는 데이터들이 보였지만, DueDate를 기준으로 정렬을 다시 구성해서 조회할 때는 상위에 보여지는 문서들에 EndDate 값이 존재하지 않아서 조회 결과에 EndDate 필드가 누락되어 보여진 것이다. 계속 페이징을 해서 내려가 보면 EndDate가 존재하는 문서는 제대로 해당 필드가 보인다.
 
  이 문제를 해결하기 위해서는 Schema.xml 의 필드 정의에서 아래와 같이 기본 값을 설정하여 NULL Value 로 인해서 해당 필드가 누락되지 않도록 설정해 주면 된다.

<field name="endDt" type="tdate" indexed="true" stored="true" required="false" multiValued="false" default="1900-01-01T00:00:00.000Z" />

  또 다른 해결법이 존재할지도 모르지만, 현재로서는 이렇게 처리를 하거나 아니면 원본 데이터를 가져오기 위한 SQL 문에서 처리를 해 주면 누락되는 필드 없이 처리가 가능하다. 단, 없는 값인데 임의로 1900/01/01 일자를 설정한 것이기 때문에 클라이언트 코드에서 이 값을 표시할 때 추가적인 처리가 필요할 수 있다.

댓글