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