0

短い質問は次のとおりです。

Solr 4.3.0 インデックスで格納されたフィールドの圧縮を無効にしたいと考えています。読んだあと :

http://blog.jpountz.net/post/35667727458/stored-fields-compression-in-lucene-4-1

http://wiki.apache.org/solr/SimpleTextCodecExample

http://www.opensourceconnections.com/2013/06/05/build-your-own-lucene-codec/

そこで説明されている道をたどり、独自のコーデックを作成することにしました。すべての手順に従っていると確信していますが、実際に自分のコーデック (愛情を込めて「UncompressedStorageCodec」という名前) を使用しようとすると、Solr ログに次のエラーが記録されます。

java.lang.IllegalArgumentException: A SPI class of type org.apache.lucene.codecs.PostingsFormat with name 'UncompressedStorageCodec' does not exist. You need to add the corresponding JAR file supporting this SPI to your classpath.
The current classpath supports the following names: [Pulsing41, SimpleText, Memory, BloomFilter, Direct, Lucene40, Lucene41]
        at org.apache.lucene.util.NamedSPILoader.lookup(NamedSPILoader.java:109)

出力から、Solr がカスタム コーデックで jar を取得していないことがわかりましたが、その理由がわかりません。

恐ろしい詳細は次のとおりです。

次のようなクラスを作成しました。

public class UncompressedStorageCodec extends FilterCodec {
    private final StoredFieldsFormat fieldsFormat = new Lucene40StoredFieldsFormat();

    protected UncompressedStorageCodec() {
        super("UncompressedStorageCodec", new Lucene42Codec());
    }

    @Override
    public StoredFieldsFormat storedFieldsFormat() {
        return fieldsFormat;
    }
}

パッケージ内: 「fr.company.project.solr.transformers.utils」

「FilterCodec」の FQDN は「org.apache.lucene.codecs.FilterCodec」です。

これから基本的なjarファイルを作成しました(Eclipseからjarとしてエクスポートしました)。

これをテストするために私が使用している Solr インストールは、解凍された基本的な Solr 4.3.0 であり、組み込みの Jetty サーバーを介して、サンプル コアを使用して開始されます。

[solrDir]\dist にコーデックを含む jar を配置しました

の:

[solrDir]\example\solr\myCore\conf\solrconfig.xml

次の行を追加しました。

<lib dir="../../../dist/" regex="myJarWithCodec-1.10.1.jar" />

次に、schema.xml ファイルで、このコーデックを使用する必要があるいくつかの fieldTypes を次のように宣言しました。

<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" postingsFormat="UncompressedStorageCodec"/>
<fieldType name="string_lowercase" class="solr.TextField" positionIncrementGap="100" omitNorms="true" postingsFormat="UncompressedStorageCodec">
<!--...-->
</fieldType>

ここで、DataImportHandler コンポーネントを使用してデータを Solr にインポートすると、コミット時に次のように通知されます。

java.lang.IllegalArgumentException: A SPI class of type org.apache.lucene.codecs.PostingsFormat with name 'UncompressedStorageCodec' does not exist. You need to add the corresponding JAR file supporting this SPI to your classpath.
The current classpath supports the following names: [Pulsing41, SimpleText, Memory, BloomFilter, Direct, Lucene40, Lucene41]
        at org.apache.lucene.util.NamedSPILoader.lookup(NamedSPILoader.java:109)

私が奇妙だと思うのは、上記のコーデック jar には、DataImportHandler コンポーネント用のトランスフォーマーもいくつか含まれていることです。そして、それらはうまく拾われます。また、dist フォルダーに配置された (および solrconfig.xml で同じように宣言された) 他の jar ファイル (jdbc ドライバーなど) も正常に取得されます。コーデックには、異なる方法でロードするこの SPI があり、彼が欠けているものがあると思います...

また、コーデック jar を次の場所に配置しようとしました。

[solrDir]\example\solr-webapp\webapp\WEB-INF\lib\

solr.war ファイルの WEB-INF\lib フォルダー内と同様に、次の場所にあります。

[solrDir]\example\webapps\

しかし、私はまだ同じエラーが発生しています。

基本的に、私の質問は、Solr がコーデック jar を取得するために何が欠けているのでしょうか?

ありがとう

4

2 に答える 2

3

この質問には、私が作成したいくつかのベンチマークのために意味がなくなったので、自分で答えようと思います: 簡単に言えば、非常に大きな格納フィールドについては、Solr 3.x および 4.0 であるという (間違った) 結論に達していました。 (フィールド圧縮なし) は、Solr 4.1 以降 (フィールド圧縮あり) よりも高速です。ただし、それは主に私のベンチマークのエラーによるものです。それらを繰り返した後、非常に大きな格納フィールドであっても、非圧縮フィールドから圧縮フィールドに移動すると、インデックス時間が 0% から 15% 遅くなるという結果が得られました。圧縮されたフィールドのインデックスは 10 ~ 20% 高速です (ドキュメントの取得部分)。

また、インデックス作成を高速化する方法については、次の点に注意してください。

  • DataImportHandlerプラグインを使用します。Solr Rest (HTTP ベース) API をバイパスし、Lucene インデックスに直接書き込みます。
  • 上記のプラグインのソースをチェックして、これがどのように達成されるかを確認し、DataImportHandler がニーズを満たさない場合は独自のプラグインを作成してください
  • 何らかの理由で Solr Rest API に固執したい場合は、ConcurrentUpdateSolrServerを使用して、キュー サイズとスレッド パラメータの数をいじってみてください。通常、基本的な HttpSolrServer よりもはるかに高速です (私の場合は最大 200%)。
  • 次のように javabin データのシリアル化を有効にすることを忘れないでください。

    ConcurrentUpdateSolrServer solrServer = new ConcurrentUpdateSolrServer(" http://some.solr.host:8983/solr ", 100, 4); solrServer.setRequestWriter(新しい BinaryRequestWriter());

ここに小さなバグがある可能性があると思われるため、コードを明示的に示しています。

ConcurrentUpdateSolrServer コンストラクターを見ると、デフォルトでリクエスト ライターが既にバイナリに設定されていることがわかります。

  //the ConcurrentUpdateSolrServer initializes HttpSolrServer objects using this constructor:
  public HttpSolrServer(String baseURL, HttpClient client) {
    this(baseURL, client, new BinaryResponseParser());
  }

ただし、デバッグ後、Binary ライター引数を指定して setWriter メソッドを明示的に呼び出さない場合でも、XmlSerializer が使用されることに気付きました。

XML からバイナリ シリアライゼーションに移行すると、サーバーに送信されるドキュメントのサイズが約 3 分の 1 に縮小されます。これにより、このケースのインデックス時間が約 150 ~ 200% 速くなります。

于 2013-07-29T13:09:57.680 に答える
0

私は最近、仕事に非常に似たものを手に入れようとして成功しました。唯一の違いは、圧縮なしではなく最適な圧縮を有効にしたいということと、Solr はデフォルトで最速の圧縮に設定されていることです。また、ある時点で「SPI クラス [...] が存在しません」というエラーが表示されました。リンク先の記事を含め、さまざまな記事から見つけたものを次に示します。

Lucene は SPI を使用して、読み込むコーデック クラスを見つけます。Lucene では、コーデック クラスのリストをファイル「org.apache.lucene.codecs.Codec」で宣言する必要があり、ファイルはクラス パス上にある必要があります。Solr にファイルをロードさせるには: JAR ファイル「myJarWithCodec-1.10.1.jar」を作成するときは、「META-INF/services/org.apache.lucene.codecs.Codec」にファイルが含まれていることを確認してください。ファイルには、次のように 1 行に 1 つの完全なクラス名が含まれている必要があります。

org.apache.lucene.codecs.lucene3x.Lucene3xCodec
org.apache.lucene.codecs.lucene40.Lucene40Codec
org.apache.lucene.codecs.lucene41.Lucene41Codec
org.apache.lucene.codecs.lucene42.Lucene42Codec
fr.company.project.solr.transformers.utils.UncompressedStorageCodec

そして、solrconfig.xml で、以下を置き換えます。

<codecFactory class="solr.SchemaCodecFactory" />

と:

<codecFactory class="fr.company.project.solr.transformers.utils.UncompressedStorageCodec" />

postingsFormat="UncompressedStorageCodec"Solr が文句を言う場合は、schema.xmlから削除する必要があるかもしれません。この特定のパラメーターは、コーデックではなく、投稿形式を指定するためのものだと思います。それが役に立てば幸い。

于 2013-07-30T22:33:26.560 に答える