2012-07-25 78 views
7

SQL Server 2008データベースを使用し、フルテキスト検索を使用するアプリケーションがあります。ハイフンを含むフレーズのSQL Serverフルテキスト検索で期待どおりの結果が返されない

まず、このようなハイフネーションされた単語を含むフレーズ、::

contains(column_name, '"one two-three-four five"') 

そして第二に、同じフレーズが、ハイフンはスペースに置き換えられ、私は以下の検索が異なる動作を理由を理解しようとしています:

contains(column_name, '"one two three four five"') 

フルテキストインデックスは、ENGLISH(1033)ロケールとデフォルトのシステムストップリストを使用します。

ハイフネーションされた単語を含む他のフルテキスト検索の私の観察から、最初のものはone two three four fiveまたはone twothreefour fiveのいずれかの一致を許可する必要があります。代わりに、one twothreefour fiveに一致します(one two-three-four fiveではなく)。


テストケース

セットアップ:

create table ftTest 
(
    Id int identity(1,1) not null, 
    Value nvarchar(100) not null, 
    constraint PK_ftTest primary key (Id) 
); 

insert ftTest (Value) values ('one two-three-four five'); 
insert ftTest (Value) values ('one twothreefour five'); 

create fulltext catalog ftTest_catalog; 
create fulltext index on ftTest (Value language 1033) 
    key index PK_ftTest on ftTest_catalog; 
GO 

クエリ:

--returns one match 
select * from ftTest where contains(Value, '"one two-three-four five"') 

--returns two matches 
select * from ftTest where contains(Value, '"one two three four five"') 
select * from ftTest where contains(Value, 'one and "two-three-four five"') 
select * from ftTest where contains(Value, '"one two-three-four" and five') 
GO 

クリーンアップ:

drop fulltext index on ftTest 
drop fulltext catalog ftTest_catalog; 
drop table ftTest; 

答えて

7

http://support.microsoft.com/default.aspx?scid=kb;en-us;200043

「英数字以外の文字が検索critera(主にダッシュ 『 - 』文字)で使用する必要があり、Transact-SQLのLIKE句の代わりに、FULLTEXTを使用するか、述語が含まれています。」

+1

質問は* SQLサーバがマッチングのために異なる挙動を示す理由*詳細については次のとおりです。

は、WHYのリンクに従ってください。それを回避することは確かに可能ですが、 "two-three-four five"は両方の行を返しますが、 "one two-three-four five"は返されません。 「1 2 3 -4」の同上。これは本当に期待される行動ですか?もしそうなら、なぜですか? – Laviak

5

ワードブレーカーの動作を予測できない場合は、文字列にsys.dm_fts_parserを実行して、ワードを分割して格納する方法を知ることをお勧めします内部インデックス以下で

例えば、実行中のsys.dm_fts_parserの「 『一つの二三から四5』の成績 -

select * from sys.dm_fts_parser('"one two-three-four five"', 1033, NULL, 0) 
--edited-- 
1 0 1 Exact Match one 
1 0 2 Exact Match two-three-four 
1 0 2 Exact Match two 
1 0 3 Exact Match three 
1 0 4 Exact Match four 
1 0 5 Exact Match five 

あなたが返される結果からわかるように、ワードブレーカーを解析し、 CONTAINSクエリの実行時に表示される結果を説明する6つのフォームを出力します。

1

フルテキスト検索では、単語はスペースや句読点のない文字列と見なされます。英数字以外の文字が出現すると、検索中に単語が「壊れる」ことがあります。 SQL Serverのフルテキスト検索は単語ベースのエンジンなので、句読点は一般的に考慮されず、索引を検索するときは無視されます。したがって、 'CONTAINS(testing、 "computer-failure")'のようなCONTAINS句は、行が "私のコンピュータを見つけるのに費用がかかる"という値と一致します。 https://support.microsoft.com/en-us/kb/200043