LinqToSql と全文検索 - できるでしょうか?
-
09-06-2019 - |
質問
誰かが全文検索を実行する良い方法を思いつきましたか(FREETEXT() CONTAINS()
) 標準の LinqToSql クエリ構文を使用して、任意の数のキーワードに対して?
ストアド プロシージャを使用したり、動的 SQL 呼び出しを生成したりする必要は明らかに避けたいと考えています。
もちろん、FREETEXT() または CONTAINS() を使用する SPROC のパラメーターに検索文字列を入力することもできますが、検索をより創造的にして、次のようなクエリを構築したいと考えていました。
「アップルパイ」ではなく「ペパロニピザ」とハンバーガー。
クレイジーなことはわかっていますが、これを LinqToSql から直接実行できたら素晴らしいと思いませんか?これを達成する方法についてのヒントをいただければ幸いです。
アップデート:たぶん何かに取り組んでいると思う ここ...
また:実際に質問内容の意味が変わってしまったため、質問タイトルに加えた変更をロールバックしました。私 知る 全文検索は LinqToSql ではサポートされていないこと - それを知りたければ、私はその質問をしたでしょう。代わりに、編集に興味を持っている大衆をなだめるために、タイトルを更新しました。
解決
残念ながら、LINQ to SQL は全文検索をサポートしていません。
世の中には次のような製品がたくさんあります。Lucene.NET、Hibernate Search が思い浮かびます。LINQ for NHibernate と NHibernate Search を組み合わせると、おそらくその機能が提供されるでしょうが、どちらもまだベータ版の段階にあります。
他のヒント
テーブル値関数を使用して全文検索コンポーネントをカプセル化し、遅延実行の利点を維持しながら LINQ 式内でそれを参照することで、この問題をなんとか回避しました。
string q = query.Query;
IQueryable<Story> stories = ActiveStories
.Join(tvf_SearchStories(q), o => o.StoryId, i => i.StoryId, (o,i) => o)
.Where (s => (query.CategoryIds.Contains(s.CategoryId)) &&
/* time frame filter */
(s.PostedOn >= (query.Start ?? SqlDateTime.MinValue.Value)) &&
(s.PostedOn <= (query.End ?? SqlDateTime.MaxValue.Value)));
ここで、「tvf_SearchStories」は、内部で全文検索を使用するテーブル値関数です。