1

私は現在、ユーザーがトレーディング カードの非常に大きなコレクション (〜 100,000 オブジェクト) を検索し、選択したカードを選択してデッキ ファイルに追加できるようにするプログラムに取り組んでいます。

私の質問は、最適な検索時間のためにこれらのオブジェクトを保存する最も効率的な方法は何ですか? 指定された検索文字列入力に一致する複数の可能な値 (名前、タイプ、ルール テキストなどのカード情報フィールド) を各オブジェクトで検索し、検索文字列に一致するすべてのカードを返すことができる必要があります。

任意の提案をいただければ幸いです。

4

3 に答える 3

2

テキストに基づいた検索を許可しているため、これは一致する文字列全体を指定するのではなく、部分文字列と一致できることを意味していると思います-すべてのフィールドに明確に定義された場合よりもはるかに難しい問題です可能な値のセット。トランプならスートが1種類で、もう1種類がランク。その場合、属性値ごとに一連のカードを維持できます。、Set<Card> hearts、など。そのようなフィールドがあれば、ドロップダウン リストから選択して検索時間を大幅に短縮できますSet<Card> clubsSet<Card> threes(クラブのセットと交差する 6 のセットを教えてください。X に一致するテキストを検索してください。)

テキスト検索可能にする必要があるフィールドについては、値の各単語に基づいてインデックスを保持することをお勧めします。たとえば、あるカードの「キャラクター」値に「ジェダイ ナイトのルーク スカイウォーカー」(カード ID 96) が含まれ、別のカードが「ジェダイ マスターのメイス ウィンドゥ」(カード ID 97) である場合、次のようなデータ構造を保持します。

Map<String, Set<Cards>> characterTerms

次のような (K,V) エントリを使用:

"luke" -> [96]
"skywalker" -> [96]
"jedi" -> [96,97]
"knight" -> [96]
"mace" -> [97]
"windu" -> [97]
"master" -> [97]

次に、検索が送信されたときに、マップ"Skyw*"内のキーを反復処理して、どのキーに の部分文字列があるかを確認できます。この場合、2 番目のエントリ。したがって、そのカードのセットを取り、指定された残りの基準に一致するカードを確認します。characterTerms"skyw"

この種の全文検索を行うための優れたライブラリはApache Luceneです。

于 2013-09-11T03:06:01.810 に答える