2013-12-09 11 views
11

検索するテーブルには、検索するテキストデータの列が4つあります。 が含まれていますようにそれはTERM1とTERM2が同じ列にある場合にのみ、を返すに見える複数の列と述語でCONTAINSを使用した全文検索 - AND

SELECT * FROM dbo.SearchTable 
WHERE CONTAINS((co1, col2, col3, col4), 'term1 AND term2') 

私はこのような何かを行います。すべての列をANDに含めるように指定する方法はありますか?

私が考えているのは、すべての検索列をJSONして1つに貼り付けることです。そうすれば、フルテキスト検索が可能ですが、.NETの個々の列を簡単に抽出できます。私は、インデクサーがこれに問題を持たず、JSONの文字と引用符を排除すると推測しています。これは正しいです?

おかげ

EDIT

JSONのアイデアを考える、クローラは、インデックスプロパティ名はので、私は{名前}、{詳細}、{long_details}何かに名前を変更する必要があると思います{x1}、{x2}、{x3}のように、検索で選択されないようにします。うまくいけば、彼らがとても短ければ彼らはとにかく索引付けされないでしょう。

EDIT2

私は、システムストップリストに基づいて、Stoplistを作成し、そのにプロパティ名を置くことができます。

答えて

12

これは動作するはずです:

SELECT * FROM dbo.SearchTable 
WHERE CONTAINS((co1, col2, col3, col4), 'term1') 
AND CONTAINS((co1, col2, col3, col4), 'term2'); 

また、あなたはそれにフルテキストインデックスに新しい計算列を追加することができます。

computedCol AS col1 + ' ' + col2 + ' ' + col3 + ' ' + col4 

とフルテキストインデックスを作成します:

CREATE FULLTEXT INDEX ON SearchTable (computedCol LANGUAGE 1033) 
KEY INDEX pk_SearchTable_yourPrimaryKeyName 

次に、あなたがこれを行うことができます:

SELECT * FROM dbo.SearchTable 
WHERE CONTAINS(*, 'term1 AND term2') 
+0

こんにちは、おかげでこのような列を追加します。私は検索用語を解析し、動的にクエリを構築しなければならないので、第1のオプションが嫌いです(可能であれば、検索は1つのコンテナに結合する必要があります)。私は計算された列についてもっと知る必要があります。彼らは永続化できると思いますが、2倍のデータを保存しています。それらが永続化されない場合、クエリ時間に多くの影響を与えますか? –

+4

値の1つがnullのSQLの文字列連結は、式全体をnullに置き換えることに注意してください。 "isnull(col、 '')"のように、各ヌル入力可能な用語をisnullでラップすることで、この問題を解決できます。 –

関連する問題