본문 바로가기

solr

data import handler

회사에서 개발하면서

spring-data를 사용해 solr와 연동하는 부분이 있는데

이게 생각보다 괜찮아서 색인도 spring data로 하고 있었다.


그러다 이번에 성능테스트를 하기 위해 mock 데이터를 수백만개를 집어넣고

전체색인을 돌렸더니... 4시간이 돌아도 색인이 안 끝난다. -_-


분명히 native query로 색인 할 수 있는 방법이 있을듯하여...

찾아보니 data import handler가 있다!



1. solrconfig.xml 수정

 - core별로 설정해줘야 한다.

add --
<lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />
<lib dir="../../../dist/" regex="mysql-connector-java-5.1.34-bin.jar" />
 
add --
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
        <lst name="defaults">
                <str name="config">data-config.xml</str>
        </lst>
     </requestHandler>

2. data-config.xml 생성
- core별 conf 디렉토리에 위치
- datasource의 batchSize를 -1로 하지않으면 OOM 발생...

<dataConfig> <script><![CDATA[ function attributes(row){ row.put('type_' + row.get('itemType'), row.get('itemValue') ); row.remove('type'); row.remove('value'); return row; } ]]></script> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/product" user="" password="" batchSize="-1" /> <document> <entity name="item" query=" select a.productId, "> <field column="productId" name="productId"/> <field column="itemId" name="itemId"/> <entity name="types" query="SELECT d.itemId, e.name AS itemType, f.`name` as itemValue FROM ... AND d.itemId = ${item.itemId}" transformer="script:attributes" processor="CachedSqlEntityProcessor"> </entity> </entity> </document>

</dataConfig>


이제 인덱싱을 해보자!