簡單的解決方案是配置請求處理程序以使用不變量來運行分佈式查詢。即使spark-solr試圖在查詢時間內更改它,該參數也會強制distrib
參數具有true
值。介紹不變可以通過添加請求處理程序條目下的定義如下行solrconfig.xml
來完成:
<lst name="invariants">
<str name="distrib">true</str>
</lst>
同時引進不變的是要解決這個問題,我認爲這是一種激進的解決方案。這是因爲解決方案涉及隱藏一個行爲,在該行爲中,您將參數值重載。通過引入不變量,您不能決定將distrib
設置爲false
:即使您的請求明確這樣做,distrib
的值仍將爲true
。在我看來,這樣做風險太大,這就是爲什麼我要提出另一種解決方案,這種解決方案可能難以實施,但不會遭受這種缺陷。
解決方案是實現一個查詢組件,該組件僅在接收到forceDistrib=true
標誌作爲參數時纔會強制執行distrib=true
。
public class ForceDistribComponent extends SearchComponent {
private static String FORCE_DISTRIB_PARAM = "forceDistrib";
@Override
public void prepare(ResponseBuilder rb) throws IOException {
ModifiableSolrParams params = new ModifiableSolrParams(rb.req.getParams());
if (!params.getBool(FORCE_DISTRIB_PARAM, false)) return;
params.set(CommonParams.DISTRIB, true);
params.set(FORCE_DISTRIB_PARAM, false);
rb.req.setParams(params);
}
}
建設可以配置Solr的通過添加組件solrconfig.xml
使用它,並設置你的請求處理程序使用它的組件之後。
添加組件solrconfig.xml
是通過將以下條目solrconfig.xml
文件來完成:
<searchComponent name="forceDistrib" class="ForceDistribComponent"/>
配置使用forceDistrib
組件的請求處理程序由請求下將其添加到組件列表中進行處理程序項。它必須是在列表中的第一個組件:
<arr name="components">
<str>forceDistrib</str>
<str>query</str>
...
</arr>
該解決方案,而不是簡單地引入不變的更復雜,更安全。