3

SOLR インスタンスで強調表示を最適化しようとしています。これにより、クエリが 2 桁遅くなるようです。トークン化されたフィールド インデックスがあり、次の定義で格納されています。

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\+" replacement="%2B"/>
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" />
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\+" replacement="%2B"/>
    <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

項ベクトルなども生成されます。

<field name="Events" type="text_general" multiValued="true" stored="true" indexed="true" termVectors="true" termPositions="true"  termOffsets="true"/>

ハイライト コンポーネントには、デフォルトの SOLR 構成を使用します。私が試したクエリは FastVectorHighlighter を使用していますが、それでも 1500 ミリ秒かかります。これは、ドキュメントごとにフィールドに 10 ~ 20 の値が格納されている 1000 ドキュメントでは非常に長くなります。クエリは次のとおりです。

q=Events:http\://mydomain.com/resource/term/906&fq=(Document_Code:[*+TO+*])&hl.requireFieldMatch=true&facet=true&hl.simple.pre=<b>&hl.fl=*&hl=true&rows=10&version=2&fl=uri,Document_Type,Document_Title,Modification_Date,Study&hl.snippets=1&hl.useFastVectorHighlighter=true

興味深いのは、solr admin stats で、単一のクエリが HtmlFormatter と GapFragmenter への 9146 のリクエストを生成することです。なぜこれが起こっているのか、ハイライターのパフォーマンスをどのように改善できるのかについて何か考えはありますか?

4

1 に答える 1

4

この問題は「hl.fl=*」によって引き起こされているようです。これにより、DefaultSolrHighlighter は、見つかったドキュメントごとに比較的多数のフィールド (インデックス内) を反復処理しました (私の場合は最大 10)。これにより、追加の O(n^2) 時間が発生します。関連するコード スニペットは次のとおりです。

for (int i = 0; i < docs.size(); i++) {
  int docId = iterator.nextDoc();
  Document doc = searcher.doc(docId, fset);
  NamedList docSummaries = new SimpleOrderedMap();
  for (String fieldName : fieldNames) {
    fieldName = fieldName.trim();
    if( useFastVectorHighlighter( params, schema, fieldName ) )
      doHighlightingByFastVectorHighlighter( fvh, fieldQuery, req, docSummaries, docId, doc, fieldName );
    else
      doHighlightingByHighlighter( query, req, docSummaries, docId, doc, fieldName );
  }
  String printId = schema.printableUniqueKey(doc);
  fragments.add(printId == null ? null : printId, docSummaries);
}

フィールドの数を減らすと、動作が大幅に改善されます。ただし、私の場合、20 フィールド以下に減らすことはできないため、それらすべてに対して FastVectorHighlighter を有効にすることで全体的なパフォーマンスが向上するかどうかを確認します。

また、一致するドキュメント (この時点で既に利用可能) からの情報を使用して、このリストをさらに減らすことができるかどうかも疑問に思っていました。

アップデート

すべてのフィールドに FastVectorHighlighter を使用する (すべてのトークン化されたフィールドに対してtermVectorstermPositions、およびtermOffsetstrueに設定する) と、強調表示の速度が 1 桁向上し、すべてのクエリが 1 秒未満で実行されるようになりました。インデックスのサイズは、元の値の 3 倍に増加しました (500M から 2G へ)。多値フィールドのフラグメントの生成方法にも問題がありますが、パフォーマンスの向上は十分に高いです。

于 2012-08-02T14:02:15.700 に答える