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をプログラムに直書きするのは如何な物かとも思うけど・・・