web-dev-qa-db-ja.com

複数の列と述語にCONTAINSを使用した全文検索-AND

たとえば、検索するテキストデータが4列ある検索テーブルがあります。

私はこのようなことをします:

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

Containsは、term1とterm2が同じ列にある場合にのみtrueを返すように見えます。すべての列をANDで含めるように指定する方法はありますか?

そうでない場合、私の考えは、すべての検索列をJSONして、それらを1つに固定することです。そうすれば、全文検索を行うことができますが、.NETの個々の列を簡単に抽出できます。インデクサーはこれに問題はなく、JSON文字と引用符は不要になると思います。これは正しいです?

ありがとう

[〜#〜]編集[〜#〜]

JSONのアイデアについて考えると、クローラーはプロパティ名にもインデックスを付けるので、{name}、{details}、{long_details}の名前を{x1}、{x2}、{x3}のような名前に変更して確実にする必要があります。 d検索で選択されません。うまくいけば、それらが非常に短い場合、とにかくインデックス付けされないでしょう。

EDIT2

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

19
user3083558

これは機能するはずです:

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')
18
mayabelle