2016-11-02 8 views
3

私はクライアントから、テキストを入力し、そのテキストフィールド内のすべての単語を検索するための検索フィールドを、顧客を含む複数のフルテキストインデックス付き列で検索するという要件があります情報を顧客情報テーブルから取得する。複数の検索語の複数の列

彼はFL Diana Brooks Miami 90210を入力するので、例えば、彼はそれぞれにこれらの用語の全て(FLDianaBrooksMiami90210は)国家、姓、姓、市や郵便番号の列にを検索することが望んでいます。

これは最初から悪い考えです。代わりに、この情報を別々に入力するために複数のフィールドを使用することを提案しました。それにもかかわらず、私が指摘しているところは、にはがありますが、パフォーマンスの観点から、なぜこれがうまくいかないのか、そして検索する用語を入力する複数のフィールドを持つ方が良いという概念の証明ができます。

私の質問に答えるために、パフォーマンスのベンチマークを得るためにクライアントが求めていることを行うフルテキストクエリを作成しようとしています。

私はこれまでのところ動作していないようですので、私は推測しますこれも可能かどうか尋ねていますか?

declare 
    @zip varchar(10)   = 90210 
    , @lastName varchar(50)  = 'Brooks' 
    , @firstName varchar(50) = 'Diana' 
    , @city varchar(50)   = 'Miami' 
    , @state char(2)   = 'FL' 
    , @searchTerm varchar(250) = '' 
    , @s varchar(1) = ' ' 

set @searchTerm = @state + ' ' + @firstName + ' ' + @lastName + ' ' + @city 

select * 
from freetexttable(contacts, (zip, lastName, FirstName, city, state), @searchTerm) ftTbl 
inner join contacts c on ftTbl.[key] = c.ContactID 

私は上記の持っているクエリが動作しているようですが、私が探していると私はそれを推測している(全体の多くを返しているだけ単一のレコードを見つけるために十分な制限ではありません私はFREETEXTTABLEを使っているからです)。

私もCONTAINSTABLEに置き換える試みたが、私はエラーが言ってます:の 'ダイアナ' 近く

メッセージ7630、レベル15、状態3、ライン26

構文エラーをフルテキスト検索条件 'FL Diana Brooks Miami'。通常の索引を使用して

私はこの問題を解決することができましたが、それはフルテキストと同じことを行うことも可能だ場合、私は興味があります。あなたがidと連接列を持つビューWITH SCHEMABINDINGを作成することができます

WHERE C.FirstName like coalesce(@FirstName + '%' , C.FirstName) 
    AND C.LastName like coalesce(@LastName + '%' , C.LastName) 
    etc. 

答えて

1

CREATE VIEW dbo.SearchView WITH SCHEMABINDING 
AS 
SELECT id, 
     [State]+' ', 
     [FirstName]+' ', 
     [LastName]+' ', 
     [City]+' ', 
     [Zip] as search_string 
FROM YourTable 

はインデックス

を作成して定期的にインデックスを使用して

私は句、以下のように適応してクエリを持っています

CREATE UNIQUE CLUSTERED INDEX UCI_SearchView ON dbo.SearchView (id ASC) 

次にフルテキストインデックスを作成するsearch_stringフィールド。

USE YourDB 
GO 

--Enable Full-text search on the DB 
IF (SELECT DATABASEPROPERTY(DB_NAME(), N'IsFullTextEnabled')) <> 1 
EXEC sp_fulltext_database N'enable' 
GO 

--Create a full-text catalog 
IF NOT EXISTS (SELECT * FROM dbo.sysfulltextcatalogs WHERE [name] = N'CatalogName') 
EXEC sp_fulltext_catalog N'CatalogName', N'create' 
GO 

EXEC sp_fulltext_table N'dbo.SearchView', N'create', N'CatalogName', N'IndexName' 
GO 

--Add a column to catalog 
EXEC sp_fulltext_column N'dbo.SearchView', N'search_string', N'add', 0 /* neutral */ 
GO 

--Activate full-text for table/view 
EXEC sp_fulltext_table N'dbo.SearchView', N'activate' 
GO 

--Full-text index update 
exec sp_fulltext_catalog 'CatalogName', 'start_full' 
GO 

その後、検索条件を作成するための関数を記述する必要があります。 F.e.

FL Diana Brooks Miami 90210 

になった:

"FL*" AND "Diana*" AND "Brooks*" AND "Miami*" AND "90210*" 

そしてFREETEXTまたはCONTAINS検索でそれを使用する:

DECLARE @search nvarchar(4000) = '"FL*" AND "Diana*" AND "Brooks*" AND "Miami*" AND "90210*"' 

SELECT sv.* 
FROM dbo.SearchView sv 
INNER JOIN CONTAINSTABLE (dbo.SearchView, search_string, @search) as c 
    ON c.[KEY] = sv.id 
+0

私は同様のアプローチをテストした後、私はちょうどあなたの答えを見つけました。私はすべての検索列を連結した新しい列を作成しました(私は知っています - 私はあなたの索引付けされたビューが好きです)、WHERE CONTAINS(searchColumn、@searchTerm)を使用していました。私が得る唯一の問題は、 '@ searchTerm'変数に' abc @ xyz.com'のような電子メールアドレスを含めると表示される電子メールアドレスであり、正しい行が返されません。 –