2017-02-23 10 views
0

私はspark-solrを使用してSolrクエリを実行しています。しかし、何らかの理由でsparkによって生成された要求が検索の分散を妨げているため、私の検索は正常に動作しません。私は、distrib=falseというパラメータが送信されたリクエストに追加されたことを見たところで、Solrのログを調べることで発見しました。 distrib=trueで手動でクエリを実行すると(スパークを使用しない)、結果は良好でした。spark-solrによる分散検索の実行

私は(私は pysparkを使用しています) options辞書に "solr.params"値を変更することにより、火花によって送信されたパラメータを設定しようとしていた

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

簡単な解決策は、不変式を使用して分散クエリを実行するように要求ハンドラを構成することです。不変量は、distribパラメータの値がtrueになるように強制します。これは、spark-solrがクエリ時に値を変更しようとしている場合でも同じです。不変のsolrconfig.xmlであなたの要求ハンドラエントリの定義に次の行を追加することによって行うことができます紹介:

<lst name="invariants"> 
    <str name="distrib">true</str> 
</lst> 

不変の導入は問題を解決しようとしている間、私はそれが根本的な解決のようなものだと思います。これは、ソリューションがパラメータの値をオーバーロードする動作を隠すためです。不変量を導入することによって、distribfalseに設定することはできません。要求が明示的にそうであっても、distribの値は依然としてtrueです。これは私の意見ではあまりにも危険なので、実装するのが難しいかもしれないが、その欠陥に悩まされない別の解決策を提案しています。

解決策は、forceDistrib=trueフラグをパラメータとして受け取った場合にのみ、distrib=trueを強制的に実行するクエリコンポーネントを実装することです。あなたはそれを使用するsolrconfig.xmlにコンポーネントを追加することによって、それを使用して、要求ハンドラを設定してSolrを設定することができるコンポーネントを構築した後

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); 
    } 
} 

solrconfig.xmlの成分がsolrconfig.xmlファイルに次のエントリを追加することによって行われる追加:forceDistribコンポーネントを使用するための要求ハンドラの設定

<searchComponent name="forceDistrib" class="ForceDistribComponent"/> 

は、要求の下でのコンポーネントのリストに追加することによって行われますハンドラエントリ。

<arr name="components"> 
    <str>forceDistrib</str> 
    <str>query</str> 
    ... 
</arr> 

このソリューションは、単純に不変式を導入するよりもはるかに安全ですが、リストの最初のコンポーネントでなければなりません。

関連する問題