今天一个朋友找我说他进行入库测试:

1个collection 2个shard,30多个字段,一个小时才入库4万条左右。

如果每条记录都很大这也是有可能的,不过我还是先让他贴代码出来看一下,他的入库代码:

public static void addIndex(String record) throws SolrServerException,

IOException {

String[] records = record.split(“\\|\\+\\|”, -1);

 

SolrInputDocument doc = new SolrInputDocument();

doc.addField(“id”, uuid(), 1.0f);

doc.addField(“DATA0”, records[0], 1.0f);1.0f);

.

.

.

doc.addField(“DATA31”, records[31], 1.0f);

 

Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();

docs.add(doc);

server.add(docs);

server.commit();

 

}

 

这样一条一条提交显然会慢的,除非要保证较强的事务性或者实时性,我建议他进行批量入,类似这样:

Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();

 

for (j = 0; j < 100000; j++) {

SolrInputDocument doc = new SolrInputDocument();

doc.setField(“id”, “i_” + i + 1 + “_j_” + j + 1 + “_”

+ ((i + 1) * (j + 1)));

doc.setField(“type”, j % 7);

doc.setField(“name”, “name” + System.currentTimeMillis());

docs.add(doc);

}

server.add(docs);

server.commit();

 

另外一点,如果我们能够控制好输入的速度,可以考虑autocommit,比如在solrconfig.xml里面配置:

<autoCommit>
<maxTime>15000</maxTime>
<maxDocs>10000</maxDocs>
<openSearcher>true</openSearcher>
</autoCommit>

上面配置的意思是:

maxTime:每15000ms,自动进行一次commit

maxDocs:若超过10000个文档更新,自动进行一次commit

openSearcher:执行完commit后记录马上可以搜索到