1

約 4,000 万のドキュメントを含むシングルコア [1] の非複製 Solr インデックスがあります。各ドキュメントには 2 つのフィールドがあり、1 つは保存され、もう 1 つは保存されません。保存されていないフィールドを検索すると、保存されたフィールドが結果になります。

このインデックスからの応答時間は約 8 秒です。注意すべきことは、私が一般的なフルテキスト クエリと見なすものを作成していないということです。各クエリには、多数の OR 条件が含まれています。これは遅いと思っていましたが、それほど遅くはありませんでした。

私が気付いたのは、JVM が利用できる 7 GB のうち、Solr が数百 MB しか使用していないことです。インデックスの多くをメモリに保持することはできません。これは私の質問につながります:RAMにインデックスの大部分(または少なくともそれ以上)を強制的に維持するようにsolrを構成する方法はありますか?

[1] シャーディングによって問題が発生します。私の Solr のアプリケーションでは、相対スコアが非常に重要です。シャード ローカル スコアリングとは、シャードが多いほど、スコアの精度が低くなることを意味します。

コメントに対する詳細情報:

私が検索するフィールドのフィールドタイプの定義は次のとおりです。

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

クエリの例を次に示します。

(Carberry J 2008 Toward a Unified Theory of High-Energy Metaphysics Silly String Theory Journal of Psychoceramics 5 11 1 3)

これは応答するのに約 10 秒かかりますが、(Carberry 2008) のように OR された用語が少ないクエリは、約 100 ミリ秒で返されます。

4

1 に答える 1

5

私は自分が抱えていた問題を見つけて解決したと信じています。

私のドキュメントの多くは、書誌メタデータで構成されているため、通常の英語のストップ ワードに加えて、いくつかの非常に一般的な単語が含まれていることがわかりました。そのような言葉には、「ジャーナル」と「議事録」が含まれます。さらに、私のドキュメントにはイニシャルを含む著者名が含まれていることが多いため、それらの多くには索引付きの 1 文字の用語が含まれていました。これらのいずれかがクエリ用語として含まれていると、応答時間が桁違いに長くなります。

私の解決策は、次のように StopFilter と LengthFilter を使用して、これらの一般的な用語を単純に除外することでした。

<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LengthFilterFactory" min="2" max="100"/>
于 2012-08-08T12:59:50.820 に答える