2017-02-23 33 views
0

我正在使用spark-solr以執行Solr查詢。但是,我的搜索不能正常工作,因爲由於某些原因,由spark生成的請求阻止了搜索的分發。我通過查看Solr日誌發現了這一點,我發現在發送的請求中添加了distrib=false參數。當用distrib=true手動執行查詢(不使用spark)時,結果很好。通過spark-solr執行分佈式搜索

我試圖通過設置在options字典改變"solr.params"值(我使用pyspark)由火花塞發出的參數:

options = { 
    "collection": "collection_name", 
    "zkhost": "server:port", 
    "solr.params": "distrib=true" 
} 

spark.read.format("solr").options(**options).load().show() 

這種變化沒有任何效果:我還看到一個distrib=false參數正在發送的日誌。通過"solr.params"密鑰傳遞的其他參數(如fq=something)確實會對結果產生影響。但看起來火花堅持發送distrib=false無論我做什麼。

如何強制通過spark-solr進行分佈式搜索?

回答

0

簡單的解決方案是配置請求處理程序以使用不變量來運行分佈式查詢。即使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> 

該解決方案,而不是簡單地引入不變的更復雜,更安全。