データベースとしてSQL Server Compactを使用するアプリケーションがvb.netで構築されているため、フルテキストインデックスを使用できません。ここすべての単語を任意の順序で含む行を検索
が自分のデータの...
MainTable
FIELD1
- A B C
- B G C
- X Y Z
- C P B
検索用語= B C
の期待される成果 =検索語のいずれかの組み合わせ=行1、2、ここで
4は、私が現在やってんだよ...
私は配列に検索語B C
を置換しています%B%C%
および%C%B%
を含み、これらの値をtempTable
のフィールド1に挿入します。
だから私のSQLは次のようになります。この単純な例では
SELECT * FROM MainTable INNER JOIN tempTable ON MainTable.field1 LIKE tempTable.field1
、それが正しく、期待される結果を返しません。しかし、私の検索語にはより多くの値を含めることができます。例えば、6つの検索語B C D E F G
が置換されると720の異なる値があり、より多くの検索語が使用されると、順列は指数関数的に増加する。
これを行うより良い方法はありますか?
を私が把握することができます唯一の方法は、行にスペースからデータを分割することです、行のみが含まれます(=単語)をリストに入れ、あなたが探している単語の数でなければならない別個の値を計算します。恐らく大きなデータセットでは恐ろしく遅いでしょう:) –
検索文字列( 'A B C D E F')を単一の列テーブル(' @ termTable')に変換すれば、何個の順列が存在するかは関係ありません。 ( ''% '+ t.term +'% ''のようにm.field1上のメインテーブルm内部結合@termTableから別名m。*を選択)別のアプローチ。 CLRアセンブリが可能な場合、カスタムランク付けを行うことができます。 –
これは、 'ABCDEF'内の各検索語が任意のものに含まれている可能性があるため、 '%' + t.term + '%' 'のようなm.field1上の@termTable tは機能しませんデータの順序。 「B A F E D C」、「A X Y Z B C D E F」などとすることができ、それらの結果がすべて返されるようにします。 –