2

次のクエリ/ステートメントから予期しない結果が得られる理由がよくわかりません。問題を再現するためのコードを含めました (これはまったく問題ではないかもしれませんが、どのように機能するかについての私の誤解containsです)。

テーブル dbo.temp を作成します (id int ID、説明 nvarchar(max))
insert dbo.temp values ('this is a website.') -- このレコードは選択クエリで返されます
insert dbo.temp values ('a website exists.') -- このレコードは select で返されます
insert dbo.temp values ('go to mywebsite.net') -- このレコードは select で返されません
insert dbo.temp values ('go to mywebsite.net.') -- このレコードは select で返されません


全文カタログ一時作成
dbo.temp (id) に一意のインデックス idx_dbo_temp_1 を作成します
dbo.temp(description) にフルテキスト インデックスを作成します
    temp のキー インデックス idx_dbo_temp_1
    change_tracking 自動で


@search_client nvarchar(100) = 'ウェブサイト' を宣言します

選択する
    *
から
    dbo.temp
どこ
    含む ((説明),@search_client)


dbo.temp にフルテキスト インデックスをドロップする
dbo.temp にインデックス idx_dbo_temp_1 をドロップします
フルテキスト カタログの一時的な削除
テーブル dbo.temp を削除

クエリは、説明フィールドにあるレコードを返しますがwebsite、説明フィールドにあるレコードは返しませんmywebsite.net

何かご意見は?

更新:@search_client変数は実際には SSRS 経由で渡されるパラメーターになるため、渡されるパラメーターをシミュレートするために変数を宣言します。

4

3 に答える 3

2

フルテキストでは、英数字以外のすべての文字がインデックスから削除され、空白に置き換えられます。あなたの検索では、「。」があったので。文字列では、「website」と「net」を検索しています。

これは 2 つの方法で修正できます。

元のデータを保持する場合、元のテーブルとは別に、フルテキスト データを含む別のテーブルまたは別のフィールドが必要です。

フルテキスト テーブルでは、「 . 」を削除して「 websitenet 」を保存できます。

その場合、すべての「.」を削除する必要があります。クエリを実行する前に検索文字列から。"." でクエリしたい場合は、"." を置き換える必要があります。文字列 - たとえば「ドット」。

したがって、この場合は「websitedotnet」を保存します。

今回検索するときは、「.」をすべて置き換えます。クエリに「ドット」を使用します。

FTSで検索する列を保存する新しいフィールドを使用して、次のようにします。

    ID      DESCRIPTION               DESCFTS
    -----------------------------------------------------
    1   this is a website.        this is a websitedot
    2   a website exists.         a website existsdot
    3   go to mywebsite.net       go to mywebsitedotnet
    4   go to mywebsite.net.      go to mywebsitedotnetdot

次に、クエリ:

declare @search_client nvarchar(100) = 'website'

set @search_client = replace(@search_client, '.', 'dot')

select * from dbo.temp where contains ((DESCFTS), @search_client)
于 2012-05-21T13:34:34.280 に答える
1

Try the following:

Updated:

select
    *
from
    dbo.temp
where
    contains ((description),'"website*"')
于 2012-05-21T12:48:52.147 に答える
0

あなたが抱えている問題は、残念ながら、FTS で先頭のワイルドカードを使用して検索できないことだと思います。CONTAINS 句を使用して検索する場合、機能的には先頭を使用できず、末尾のみを使用できます。先頭のワイルドカード検索の回避策を探してください。mywebsite.netが表示されない問題を引き起こしているのはMYです。これは、前述の DOT の問題と組み合わされています。いくつかの回避策がありましたが、私にはハッキリしているように見えます。また、パフォーマンス向上の可能性について FREETEXT を調査してください。

于 2012-05-21T13:45:38.170 に答える