• フルテキストインデックスの作成方法
  • フルテキストインデックスの検証
    • 1テーブルに複数のフルテキストインデックスを付けれるか。
      例:WHERE CONTAINS([製品名], @productNames) OR CONTAINS([型番], @typeNames)
    • 複数カラムに対してクエリーをかかえるか。(入力されたテキストがどちらかにマッチすればOK。
      例:WHERE CONTIANS([製品名], [型番], @text)
    • 部分一致での検索が可能か?
      例:電話というテキストに対して、携帯電話が引っかかる。
    • インデックスは動的に更新されるか?
      例:新しい製品名を追加後、即検索対象になる。

7件のコメント

iwamoto · 2009-04-05 00:22

調査難航中
フルテキストインデックスを作成しようとすると、

「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
フルテキスト検索キーには、
・NULL 値が許容されず
・一意な単一列インデックス
を指定する必要があります。

そのインデックスは
・オフラインではなく
・保存されない計算列での定義が不明確または不正確ではなく
・最大サイズが 900 バイト
である必要があります。
」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」
とおこられる。
うーん。
最初の2つはクリアできていて、あとの3つは言われている意味を含め調査中です。

とりあえず調査時に実行するコマンドのながれをメモ

USE master
go

sp_attach_db MyDB ,’C:Documents and SettingsAdministratorMy DocumentsVisual Studio 2005WebSitesSampleWebSiteApp_DataMyDB.mdf’, ‘C:Documents and SettingsAdministratorMy DocumentsVisual Studio 2005WebSitesSampleWebSiteApp_DataMyDB_log.LDF’
go

USE MyDB
go

———————————————————————————-
ここでフルテキストインデックスを作成しようとしている

CREATE FULLTEXT INDEX ON books(title)
KEY INDEX fulltextindex
go

※booksはテーブル名
※titleはフルテキスト検索をしたい対象のカラム名
※fulltextindexはフルテキストインデックスを格納するカラム名
———————————————————————————-

USE master
go

sp_detach_db ‘MyDB’
go

フルテキストインデックス関連のコマンド
・EXEC sp_fulltext_database ‘enable’;
・EXEC sp_fulltext_database ‘disable’;

iwamoto · 2009-04-05 23:47

フルテキストインデックスの作成方法とVisual Studioからの利用方法のみ調査完了

Visual Studio 2005からフルテキストインデックス利用する場合はローカルDBは使えない。
SQLServer(フルテキストインデックスをサポートしているもの)に直接接続して使う。

SQLServerで以下のコマンドを入力。SQLServerでデータベースから作成。


USE master
GO
–デフォルトでフルテキストインデックスが有効になる。
CREATE DATABASE _fulltext;
GO

USE _fulltext
GO

CREATE TABLE books(
isbn varchar(30) PRIMARY KEY NOT NULL,
title varchar(100),
summary varchar(100),
price int,
)

CREATE UNIQUE INDEX ui_title ON books(isbn);
CREATE FULLTEXT CATALOG fc_books AS DEFAULT;
CREATE FULLTEXT INDEX ON books(title)
KEY INDEX ui_title
GO

Visual Studio側でフルテキストに対応するには、これらのdllを参照に追加する必要がある。
Microsoft.SqlServer.ConnectionInfo.dll
Microsoft.SqlServer.Smo.dll
Microsoft.SqlServer.SqlEnum.dll
Microsoft.SqlServer.SmoEnum.dll

データソースの構成で
・データソースを SQLServer に
・サーバー名を localhost に
・データベースの選択または入力を _fulltext に
・接続の確認ボタンを押す(「テスト接続に成功しました」と出るはず。)

その後、クエリビルダで
SELECT * FROM books CONTAINS(title, ‘ASP’)
などを実行させてみる。

テーブルにデータが入っていたら、ここで望む結果が入っているはずです。

参考までに、すでに作成されているデータベースのフルテキストインデックスを有効にしたいときは
EXEC sp_fulltext_database ‘enable’;
GO

iwamoto · 2009-04-06 17:40

1テーブルの複数行に対して1つのフルテキストインデックスを作成することができます。
例にあるとおりの記述で思ったように動作するフィルタがかけられます。
具体的な方法は以下のとおり

CREATE TABLE books3 (
isbn varchar(30) PRIMARY KEY NOT NULL,
title varchar(100),
summary varchar(100),
opinion varchar(100),
price int,
)
GO

CREATE UNIQUE INDEX ui_title ON books3(isbn)
go

–Language 1041は対象の列で使用する言語(1041は日本語)を指定している。
CREATE FULLTEXT IDNEX ON books3
(
title
Language 1041,
summary
Language 1041,
opinion
Language 1041
)

KEY INDEX ui_title;
go

このテーブルに対してのフルテキスト検索クエリは以下のとおり
SELECT isbn, title, summary, opinion, price FROM books3 WHERE CONTAINS(title, @title) OR CONTAINS(summary, @summary) OR CONTAINS(opinion, @opinion)

iwamoto · 2009-04-06 17:50

複数カラムに対してクエリーを書くことができ、入力されたテキストがいずれかにマッチします。
書式は以下のとおり
SELECT isbn, title, summary, opinion, price FROM books3 WHERE CONTAINS((title, summary, opinion), @keyword)

iwamoto · 2009-04-06 17:56

部分一致での検索ができます。

iwamoto · 2009-04-06 19:39

>インデックスは動的に更新されるか?

データが10個入ったbooks3テーブルでinsert後にフルテキスト検索を実施したところ、
即時に検索対象になった。

その後の同じテーブルに対してUpdate後にフルテキスト検索を実施したところ、
即時に検索対象になった。

koreyasu · 2009-04-06 19:42

インデックスを即時に反映するかどうかのパラメータ設定方法と初期値を調べる。

現在コメントは受け付けていません。