EF CoreでSQL Serverのフルテキストインデックスを使う

Entity Framework CoreでSQL Serverのフルテキストインデックスを使用した検索を使ったアプリを作成してみた。

SQL Serverのフルテキストインデックスは、対象テーブルの行に対して、ユニークキーを指定しなければならない。例えば以下のようなテーブル構成にしておく必要がある。

検索結果として、このキーだけを取得するには、CONTAINSTABLE関数で、テーブルとカラム、検索文字列を指定すれば良い。上記構成で、対象テーブルのカラムデータ中から指定文字列を持つ行を取得するには、以下のようなSQLを発行する。

select * from BusinessHistoryDetail d where d.FullTextUniqKey
                in (select [KEY] from CONTAINSTABLE(BusinessHistoryDetail,*,'"C#*"'))

これにより、全てのカラムを対象に指定したキーワードを含む、レコードのユニークキーを取得する事が可能である。

EF Coreで生SQLを発行した結果をLINQクエリに返すにはFromSqlRawメソッドを使用する。上記の例で、キーワード検索結果をベースとして、氏名なども結果として取りたい場合は、以下のような感じのクエリを発行すればよい。

// 検索キーワードはstrkeywに入力されている
// フルテキストインデックス検索のキーワードは"<キーワード>*"の形で指定
string keyw = @"""" + strkeyw + "*"""; 
var q = from d in ctx.BusinessHistoryDetail.FromSqlRaw(
    @"select * from BusinessHistoryDetail d 
        where d.FullTextUniqKey
        in (select [KEY] from CONTAINSTABLE(BusinessHistoryDetail,*,{0}))",keyw)
    join h in ctx.BusinessHistoryHeader on d.EmployeeNo equals h.EmployeeNo
    select new {
        EmpNo = d.EmployeeNo,
        Name = h.Name,
        Project = d.ProjectName,
        Customer = d.CustomerName,
        OS = d.OS,
        Language = d.Language,
        Tools = d.Tools
    };

こんな感じでフルテキスト検索を行う事ができた。

なぜ、フルテキスト検索をEF Coreでやりたかったのかというと、以前作成した社内システムをdotnet coreに置き換えたいから。
以前のシステムでもフルテキスト検索を行っているが、その部分だけ、EFクエリではなく、SqlClientを使わなければならなかったため。
「EFだけで出来ればいいのになぁ」と思っていたので。

まぁ、EF使ってるのにSQLをプログラムに直書きするのは如何な物かとも思うけど・・・

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。
カテゴリー: C#, dotnetcore, Entity Framework, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください