stylesheet

2010-08-28

Apache Solr + MySQL + PHP で全文検索のメモ

Apache Solr + MySQL + PHP で全文検索を行う時のメモ。

Apache Solr 1.4.1 (jetty)
MySQL 5.0 (mysql-connector-java-5.1.13)
PHP5

JDBCとMySQLの文字コードはちゃんと指定しておく

例外出るので...

JDBCの文字コードを指定 (db-data-config.xml)

jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=UTF8

MySQLの文字コードを指定 (my.cnf)

[mysqld]
character-set-server = utf8
collation-server = utf8_bin

DataImportHandler の full-import 時に java.lang.OutOfMemoryError 例外

致命的: Full Import failed
org.apache.solr.handler.dataimport.DataImportHandlerException: java.lang.OutOfMemoryError: Java heap space
        at org.apache.solr.handler.dataimport.DocBuilder.buildDocument(DocBuilder.java:424)
        at org.apache.solr.handler.dataimport.DocBuilder.doFullDump(DocBuilder.java:242)
        at org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:180)
        at org.apache.solr.handler.dataimport.DataImporter.doFullImport(DataImporter.java:331)
        at org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:389)
        at org.apache.solr.handler.dataimport.DataImporter$1.run(DataImporter.java:370)
Caused by: java.lang.OutOfMemoryError: Java heap space
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3001)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2941)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3489)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:919)
        at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1416)
        at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2886)
        at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:476)
        at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2581)
        at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1757)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2171)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2562)
        ...

起動時のheapサイズを増やしてもかわらず。FAQに記載のとおりdatasourceにbatchSize=-1を指定して解決。

db-data-config.xml

<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/data..." batchSize="-1" ... />

管理コンソールのURL