4

CONTAINSTABLE検索アルゴリズムに使用します。特定の列値でダッシュを無視して列値を検索したい。たとえば、列に「12345-67」が含まれている場合、次のクエリのように「1234567」で検索する必要があります。

SELECT * 
FROM table1 AS FT_Table
INNER JOIN CONTAINSTABLE(table2, columnname, '1234567') AS Key_Table ON FT_Table.ID = Key_Table.[Key]

ダッシュ (-) を含まない文字列で検索するときにダッシュ (-) を無視する方法はありますか?

4

1 に答える 1

2

私は掘り下げて、数時間を費やしました:) 残念ながら、それを実行する方法はありません。Sql Server FTS は、単語 (空白を除く)と特殊文字 (-、{、( など)を分割して単語を入力するように見えますが、 完全な単語を入力するわけではありません。 (つまり、住民課に「~」が含まれている場合は「~」に置き換えてください。)状況を明確にするために例を挙げました。

まず、テーブル、FTS カタログ、全文インデックスを作成し、テーブルのサンプル行を挿入します。

CREATE TABLE [dbo].[SampleTextData] 
(
  [Id] int identity(1,1) not null,
  [Text] varchar(max) not null,
  CONSTRAINT [PK_SampleTextData] PRIMARY KEY CLUSTERED 
  (
        [Id] ASC
  )
);  
CREATE FULLTEXT CATALOG ftCatalog AS DEFAULT;  
CREATE FULLTEXT INDEX ON SampleTextData
(Text)
KEY INDEX PK_SampleTextData
ON ft 

INSERT INTO [SampleTextData] values ('samp-le text')

次に、サンプル クエリを提供します。

select * from containstable(SampleTextData,Text,'samp-le') --Success

select * from containstable(SampleTextData,Text,'samp') --Success

select * from containstable(SampleTextData,Text,'le') --Success

select * from containstable(SampleTextData,Text,'sample') -- Fail

これらのサンプルは、1 つの「Samp-le」を除いて成功しています。状況を調査するには、次のクエリを実行します。

SELECT display_term, column_id, document_count
FROM sys.dm_fts_index_keywords (DB_ID('YourDatabase'), OBJECT_ID('SampleTextData')) 

出力:

le          2   1
samp        2   1
samp-le     2   1
text        2   1
END OF FILE 2   1

このクエリは、FTS ポピュレーション サービスによって入力された単語の結果を返します。ご覧のとおり、母集団の結果には'le'、'samp'、'samp-le' が含まれていますが、 'sample' は含まれていませんsampleこれが、クエリの取得が失敗した理由です。

于 2017-11-28T13:34:52.660 に答える