リファレンスによると、Implicit RequestHander は solrconfig.xml に設定を書かなくても使用できるリクエストハンドラである、と書かれています。
これらの Implicit RequestHander がどこでどのように定義されているのかを調べてみました。
Solr のソースでそれらしいものを探してみると solr/core/src/resources/ImplicitPlugins.json というファイルが見つかりました。
{
"requestHandler": {
"/update": {
"useParams":"_UPDATE",
"class": "solr.UpdateRequestHandler"
},
"/update/json": {
"useParams":"_UPDATE_JSON",
"class": "solr.UpdateRequestHandler",
"invariants": {
"update.contentType": "application/json"
}
},
"/update/csv": {
"useParams":"_UPDATE_CSV",
"class": "solr.UpdateRequestHandler",
"invariants": {
"update.contentType": "application/csv"
}
},
"/update/json/docs": {
"useParams":"_UPDATE_JSON_DOCS",
"class": "solr.UpdateRequestHandler",
"invariants": {
"update.contentType": "application/json",
"json.command": "false"
}
},
(略)
これを読み込んでいるのが
solr/core/src/java/org/apache/solr/core/SolrCore.java
です。該当箇所は以下の通り。読み込んだ定義情報は getImplicitHandlers() で取得できます。
private static final class ImplicitHolder {
private ImplicitHolder() { }
private static final List INSTANCE;
static {
@SuppressWarnings("unchecked")
Map implicitPluginsInfo = (Map) Utils.fromJSONResource("ImplicitPlugins.json");
@SuppressWarnings("unchecked")
Map> requestHandlers = (Map>) implicitPluginsInfo.get(SolrRequestHandler.TYPE);
List implicits = new ArrayList<>(requestHandlers.size());
for (Map.Entry> entry : requestHandlers.entrySet()) {
Map info = entry.getValue();
info.put(CommonParams.NAME, entry.getKey());
implicits.add(new PluginInfo(SolrRequestHandler.TYPE, info));
}
INSTANCE = Collections.unmodifiableList(implicits);
}
}
public List getImplicitHandlers() {
return ImplicitHolder.INSTANCE;
}
RequestHanders クラスの初期化処理の中で、solrconfig.xml で定義されて RequestHander と implicit として定義されている RequestHander (SolrCore.getImplicitHanders()で取得)の両方が読み込まれて初期化されています。
void initHandlersFromConfig(SolrConfig config) {
List implicits = core.getImplicitHandlers();
// use link map so we iterate in the same order
Map infoMap= new LinkedHashMap<>();
//deduping implicit and explicit requesthandlers
for (PluginInfo info : implicits) infoMap.put(info.name,info);
for (PluginInfo info : config.getPluginInfos(SolrRequestHandler.class.getName())) infoMap.put(info.name, info);
ArrayList infos = new ArrayList<>(infoMap.values());
List modifiedInfos = new ArrayList<>();
for (PluginInfo info : infos) {
modifiedInfos.add(applyInitParams(config, info));
}
handlers.init(Collections.emptyMap(),core, modifiedInfos);
handlers.alias(handlers.getDefault(), "");
if (log.isDebugEnabled()) {
log.debug("Registered paths: {}", StrUtils.join(new ArrayList<>(handlers.keySet()), ','));
}
if (handlers.get("") == null && !handlers.alias("/select", "")) {
if (handlers.get("") == null && !handlers.alias("standard", "")) {
log.warn("no default request handler is registered (either '/select' or 'standard')");
}
}
}
この時点で Implicit RequestHandler は solrconfig.xml で定義されているものと同等の扱いになっている訳です。