ユーザーが入力した検索クエリを SQL Server の全文検索で使用する where 句に変換する
-
21-08-2019 - |
質問
ユーザーが入力した検索語を、全文検索の where 句で使用してテーブルにクエリを実行し、関連する結果を取得できるクエリに変換する最善の方法は何でしょうか?たとえば、ユーザーが入力した次のクエリは次のとおりです。
+"e-mail" +attachment -"word document" -"e-learning"
次のように翻訳されるはずです。
SELECT * FROM MyTable WHERE (CONTAINS(*, '"e-mail"')) AND (CONTAINS(*, '"attachment"')) AND (NOT CONTAINS(*, '"word document"')) AND (NOT CONTAINS(*, '"e-learning"'))
私はを使用しています クエリパーサークラス 現時点では、ユーザーが入力したクエリを正規表現を使用してトークンに解析し、トークンから where 句を構築します。
ただし、これはおそらく全文検索を使用する多くのシステムで共通の要件であることを考えると、他の開発者がこの問題にどのように取り組んだのか、より良い方法があるのかどうかに興味があります。
解決
これは、あなたが探しているまさにではないかもしれないが、それはあなたにいくつかの更なるアイデアを提供することがあります。
http://www.sqlservercentral.com/articles/全文検索+ +(2008)/ 64248 / の
他のヒント
どのように実施し受け答えます。Net/C#/エンティティの枠組み...
ト皮肉を使用nuget.
コードを書このように変換するユーザが入力した文字列を返します。
var grammar = new Irony.Samples.FullTextSearch.SearchGrammar(); var parser = new Irony.Parsing.Parser(grammar); var parseTree = parser.Parse(userEnteredSearchString); string query = Irony.Samples.FullTextSearch.SearchGrammar.ConvertQuery(parseTree.Root);
もの書き保存手順のようになります:
create procedure [dbo].[SearchLivingFish] @Query nvarchar(2000) as select * from Fish inner join containstable(Fish, *, @Query, 100) as ft on ft.[Key] = FishId where IsLiving = 1 order by rank desc
Runモードです。
var fishes = db.SearchLivingFish(query);
上記の@franzoの回答に加えて、おそらくSQLのデフォルトのストップワードの動作も変更したいでしょう。そうしないと、1 桁の数字 (またはその他のストップ ワード) を含むクエリは結果を返しません。
ストップ ワードを無効にするか、独自のストップ ワード リストを作成するか、または「ノイズ ワードが変換されるように設定する」のいずれか、あるいはその両方を行います。 SQL 2008:全文検索クエリのストップワードをオフにする
(英語) SQL ストップワードのシステムリストを表示するには、次を実行します。
select * from sys.fulltext_system_stopwords where language_id = 1033
元の質問から少し脱線していることは承知していますが、SQL フルテキスト インデックスから離れて、次のようなものを使用することを検討しましたか? Lucene/Solr その代わり?
これを行う最も簡単な方法は、(ここではセキュリティ上の問題を挿入し、私が知っている)、動的SQLを使用すると、正しくフォーマットされた文字列の中にフレーズを分割することです。
あなたは新しい文字列を作成するために使用できるテーブル変数にフレーズを分割する機能を使用することができます。
GoldParserとCalithaの組み合わせは、ここであなたを整理する必要があります。
この記事: http://www.15seconds.com/issue/070719.htm >あなたのための翻訳のいくつかをしているだけでなくgoogleToSqlクラスを持っています。