Solr 8.9.0でのワイルドカードクエリに関するパフォーマンス問題

トピック作成者:ks-solruserml-bot (2024/09/01 21:28 投稿)
2
OpenOpen

(The bot translated the original post https://lists.apache.org/thread/qlx9nm4c5m0d5bb0wwxrfczm556qm5l6 into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)

Solr 8.9.0を使用しています。Solr Cloudを2つのシャードに分割し、それぞれのシャードに1つのレプリカを持たせています。また、Solr Cloudのために5つのZooKeeperを使用しています。

「documents」というコレクションを作成し、1つのシャードのインデックスサイズは21GBです。スキーマフィールドは以下のように設定されています:

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" omitNorms="true" termVectors="false" termPositions="false" termOffsets="false" docValues="true"/>
<field name="doc_ref" type="text_string" indexed="true" stored="true" multiValued="false" omitNorms="true" termVectors="false" termPositions="false" termOffsets="false" omitTermFreqAndPositions="true"/>
<fieldtype name="text_string" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldtype>

データを検索する際に「test」を含むデータを見つけたいと考えています。そのため、doc_ref:*test*というワイルドカードクエリを使用しています。しかし、このワイルドカードクエリが高いメモリとCPUを消費していると思われます。時々、このワイルドカードクエリの使用によってコレクションがリカバリーモードに入る問題が発生しています。

パフォーマンスを向上させるために、ReversedWildcardFilterFactoryを実装しました。

ReversedWildcardFilterFactoryを適用した後、どのように検索すればよいでしょうか?同じ方法でdoc_ref_rev:*test*と検索しても、クエリの実行時間に関しては改善が見られません。

インデックスサイズが大きい場合、ワイルドカード文字列(*test*)を検索する際の最適なアプローチをご提案いただけませんか?

よろしくお願いします。

Vishal

返信投稿者:ks-solruserml-bot (2024/09/01 21:28 投稿)

こんにちは、Vishal

以前この問題について調査を行いましたが(こちらの動画)、まだこの問題に対して優れた解決策は見つかっていません。

ReverseWildcardは、このケースではほとんど効果がなく、インデックスサイズが大きくなるだけですので、まずそれをやめましょう。NGramトークナイザーは、インデックスをさらに大きく膨らませます。

次に、を使ってセグメントの数を減らし、可能な限り少ないセグメントを要求する実験を行ってみてください。セグメンテーションの理由は、ほぼ同じ用語が各セグメントで繰り返されるからです。

次に、以下の範囲クエリを試してみてください [0 TO z]。これは多くの用語とほぼすべてのドキュメントにヒットするはずです。これは、重いワイルドカード展開クエリの見積もりを提供します。ワイルドカードクエリの実行時間は、その範囲クエリの実行時間と同程度だと思われます。もし範囲クエリが遅くなっている場合、ハードウェアの追加やシャードの分割を行うしかありません(ただし、それが直線的にスケールすることはほとんどありません)。

もう一つ取る価値のある対策は、Solrのヒープサイズを制限し、mmapインデックスファイルに十分なRAMを残しておくことです。

--
よろしくお願いします、
Mikhail Khludnev

返信投稿者:ks-solruserml-bot (2024/09/01 21:29 投稿)

Mikhailが指摘したように、ReversedWildcardFilterFactoryはこのケースに対して効果がありません。これは先頭にワイルドカードが付いたクエリ用のものであり、あなたのクエリには先頭と末尾の両方にワイルドカードが付いています。

ワイルドカードクエリは特にリソースを消費します。

例えば、doc_ref:*test*doc_ref フィールド内の100万件の異なる用語にマッチするとしましょう。ここで言っているのはドキュメントのことではなく、用語のことです。

内部的に、Solrはまずワイルドカードを展開して100万件のマッチする用語をすべて取得し、次にクエリを実行します。これには100万件の用語が含まれることになります。これにより、大量のCPUとメモリが消費されるでしょう。

「test」が doc_ref フィールド内で明確な単語として存在する場合、それとも abctestxyz のような値にもマッチさせる必要がありますか?もしそれが明確な単語であれば、比較的標準的な分析チェーンを使用してTextFieldのfieldTypeでワイルドカードを使用しない方が良いかもしれません。

ありがとうございます。
Shawn

トピックへ返信するには、ログインが必要です。

KandaSearch

Copyright © 2006-2024 RONDHUIT Co, Ltd. All Rights Reserved.

投稿の削除

この投稿を削除します。よろしいですか?