Luceneの検索件数を返すtotalHitsがintだったので32bit以上だとどうなるんだろうと思ってやってみた。 書いたコード。
import java.io.File
import org.apache.lucene.analysis.core.WhitespaceAnalyzer
import org.apache.lucene.document.Document
import org.apache.lucene.document.Field
import org.apache.lucene.index.DirectoryReader
import org.apache.lucene.index.IndexWriter
import org.apache.lucene.index.IndexWriterConfig
import org.apache.lucene.search.IndexSearcher
import org.apache.lucene.search.MatchAllDocsQuery
import org.apache.lucene.store.FSDirectory
import org.apache.lucene.store.SimpleFSDirectory
import org.apache.lucene.util.Version
class Foo extends App {
def createIndex() {
val dir = new SimpleFSDirectory(new File("index"))
val config = new IndexWriterConfig(Version.LUCENE_4_9, new WhitespaceAnalyzer(Version.LUCENE_4_9))
val writer = new IndexWriter(dir, config)
var i = 0L
while (i < Integer.MAX_VALUE.toLong + 1000) {
val doc = new Document()
doc.add(new Field("id", (i % 1000).toString, Field.Store.NO, Field.Index.ANALYZED))
writer.addDocument(doc)
}
writer.close()
}
}
Integer.MAX_VALUE.toLong + 1000までドキュメント書き込みまくれと命令している。
結果はまあそうだよなぁという感じで、先にソースコード見た方が早いだろうという結果。
Exception in thread "main" java.lang.IllegalArgumentException: Too many documents, composite IndexReaders cannot exceed 2147483647
ちなみにsolrjのgetNumFoundはlongになっている。普通に考えて1個のLuceneのsegmentが2億もデータを持ったりはしないだろうから、分散してそれ以上になるようなパターンではsolrなりelastic searchなりで取りまとめてもらえば問題ないわけか。