単語/式の途中に表示されるもの(「LIKE%book%」の検索など)を検索する方法に頭を悩ませようとしていますが、SQL Server(2005)の全文カタログにあります。
どうやってやるの?両方のように見え、検索式の先頭CONTAINS
でワイルドカードをFREETEXT
実際にサポートしていません-それは本当に可能ですか?
FREETEXT(*, "book")
「再予約」など、「本」が入っているものなら何でも見つかると思いました。
単語/式の途中に表示されるもの(「LIKE%book%」の検索など)を検索する方法に頭を悩ませようとしていますが、SQL Server(2005)の全文カタログにあります。
どうやってやるの?両方のように見え、検索式の先頭CONTAINS
でワイルドカードをFREETEXT
実際にサポートしていません-それは本当に可能ですか?
FREETEXT(*, "book")
「再予約」など、「本」が入っているものなら何でも見つかると思いました。
残念ながら、CONTAINSはプレフィックスワイルドカードのみをサポートします。
CONTAINS(*, '"book*"')
SQL Server 全文検索は、テキストを単語にトークン化することに基づいています。単語に小さな単位はないので、探せる最小のものは単語です。
プレフィックス検索を使用して、特定の文字で始まる一致を探すことができます。これは、単語リストがアルファベット順に保持されており、サーバーが行う必要があるのはリストをスキャンして一致を見つけることだけであるためです。
句を使用したクエリで必要なことを行うには、LIKE '%book%'
おそらく同じくらい高速(または低速)になります。
本格的な全文検索を行いたい場合は、Lucene.Netを使用します(そして使用します)。MS SQLの全文検索は、基本的なこと以外ではうまく機能しないようです。
これは、そのワイルドカード制限の回避策である提案です。検索している列と同じ内容を逆に含む計算列を作成します。
たとえば、「ProductTitle」という名前の列を検索している場合は、ProductsRevという名前の列を作成します。次に、そのフィールドの「計算列の仕様」の値を次のように更新します。
(reverse([ProductTitle]))
検索に「ProductsRev」列を含めると、単語の先頭でワイルドカードをサポートする結果を返すことができるようになります。幸運を!!
全文には、エンジンが検出したすべての単語をリストした表があります。フルテキスト インデックス テーブルよりも桁違いに行数が少ないはずです。そのテーブルから「'%book%' のようなフィールド」を選択して、'book' を含むすべての単語を取得できます。次に、そのリストを使用して全文クエリを記述します。面倒ですが、うまくいきますし、速度部門では問題ありません。ただし、最終的には、これを行っているときにフルテキストを間違って使用しています。フルテキストが何をしているのかについて、これらの機能要求のソースを教育する方が実際には良いかもしれません. 何をしたいのかを理解してもらい、全文から高い価値を得ることができます。たとえば、単語の末尾にのみワイルド カードを使用します。これは、単語を順序付けられたリストで考えることを意味します。
C#でアセンブリをプログラムして、繰り返されていないすべてのサフィックスを計算しないのはなぜですか。たとえば、「赤身の肉を食べる」というテキストがある場合、「赤身の肉を食べる」というフィールドに保存できます (「赤身の肉を食べる」を追加する必要はないことに注意してください)。全文検索を使用します。Csharpで簡単に書ける機能
x) 私はそれが奇妙に思えることを知っています... それは回避策です x) 私は挿入/更新にオーバーヘッドを追加していることを知っています.... このオーバーヘッドが検索機能の改善以外に重要でない場合にのみ正当化されます x) 私はそこにあることを知っています格納されたデータのサイズのオーバーヘッドでもあります。
しかし、私はそれがかなり速いと確信しています