这是我的solrconfig.xml文件的默认设置:
<autoSoftCommit>
<maxTime>${solr.autoSoftCommit.maxTime:-1}</maxTime>
</autoSoftCommit>
maxTime为'-1'是否表示自动软提交已关闭?如果是这样,如果我完全删除了标签,我会得到相同的结果吗?如果我必须手动执行软提交,可以使用'commitWithin'(我用Google搜索但是得到了相互矛盾的答案)吗?
哦,我正在使用Solr 4.5.0
答案 0 :(得分:18)
首先,您可以在标记中看到表达式${solr.autoSoftCommit.maxTime:-1}
。这允许您使用Solr的变量替换。该功能详细描述here in the reference。如果该变量未被任何方式替换,则-1
被视为该配置的值。
将commitMaxTime转为-1 有效地关闭了自动提交。如果你看一下下面的相关代码,你可以看到commitMaxTime
否决了maxDocs
的任何值,因为scheduleCommitWithin方法立即返回。我没有发现记录这种行为,所以我查了一下代码。
private void _scheduleCommitWithin(long commitMaxTime) {
if (commitMaxTime <= 0) return;
synchronized (this) {
if (pending != null && pending.getDelay(TimeUnit.MILLISECONDS) <= commitMaxTime) {
// There is already a pending commit that will happen first, so
// nothing else to do here.
// log.info("###returning since getDelay()==" + pending.getDelay(TimeUnit.MILLISECONDS) + " less than " + commitMaxTime);
return;
}
if (pending != null) {
// we need to schedule a commit to happen sooner than the existing one,
// so lets try to cancel the existing one first.
boolean canceled = pending.cancel(false);
if (!canceled) {
// It looks like we can't cancel... it must have just started running!
// this is possible due to thread scheduling delays and a low commitMaxTime.
// Nothing else to do since we obviously can't schedule our commit *before*
// the one that just started running (or has just completed).
// log.info("###returning since cancel failed");
return;
}
}
// log.info("###scheduling for " + commitMaxTime);
// schedule our new commit
pending = scheduler.schedule(this, commitMaxTime, TimeUnit.MILLISECONDS);
}
}
对于问题的第二部分,如果一起删除标记 strong>,则与将值设置为-1的结果相同。如下所示,如果xpath表达式返回null,则将获得-1作为默认值。
但是从配置中删除整个表达式也将删除通过Solr的变量替换覆盖该配置的选项。
protected UpdateHandlerInfo loadUpdatehandlerInfo() {
return new UpdateHandlerInfo(get("updateHandler/@class",null),
getInt("updateHandler/autoCommit/maxDocs",-1),
getInt("updateHandler/autoCommit/maxTime",-1),
getBool("updateHandler/autoCommit/openSearcher",true),
getInt("updateHandler/commitIntervalLowerBound",-1),
getInt("updateHandler/autoSoftCommit/maxDocs",-1),
getInt("updateHandler/autoSoftCommit/maxTime",-1),
getBool("updateHandler/commitWithin/softCommit",true));
}