1

現在、映画やテレビ番組のデータベース テーブルを全文検索することを主な目的とするストアド プロシージャがあります。部分キーワード検索を行うために、検索クエリをスペースで分割するコードを SQL に追加し、次のようなステートメントを出力しました。

"batman*" ~ "be*"

たとえば、元の文字列「batman be」は、ユーザーが入力しているときにページ上のテキストボックスから生成でき、JavaScript キーアップイベントごとに、そのテキストボックスにあるものをストアド プロシージャに送信して、結果を次のように取得します。入力します(オートコンプリートのように)。この場合、ユーザーは "Batman Begins" または "The Batman: Batgirl Begins" (テレビ番組のエピソード) を探していた可能性があり、結果として両方が表示されるはずです。

以下は私のクエリのサンプルです。上記の例では、@partialKeywordString は"batman*" ~ "be*".

SELECT f.title
FROM Films f INNER JOIN
    CONTAINSTABLE(Films, Title, @partialKeywordString) f_key ON f.filmid = f_key.[key]
ORDER BY f_key.Rank DESC

クエリの問題は、ランキングが期待どおりに表示されないことです。「バットマン」だけを検索すると、「バットマン」という単語で始まる、または「バットマン」という単語だけを含むすべての映画のタイトルが最初に表示されると思われます。しかし、そうではありません。
「バットマン」だけを検索した場合の結果の例を以下に示します。

「バットマン:アニメシリーズ - エピソード 114」
「バットマンとロビンの冒険 - エピソード 218」
「バットマンとロビン - エピソード 101」
「バットマン - エピソード 101」
「バットマンとロビン - エピソード 204」

リストのずっと下に、私が探していた映画があります。「バットマン ビギンズ」または単に「バットマン」です。

このクエリを微調整する方法についてのアドバイスを探しています。私は間違いなく SQL の専門家ではなく、上記のコードを手動で処理して動作させただけのように感じます。もっと洗練された、または強力な解決策があるような気がしますが、まだ見つけていません。

前もって感謝します

4

2 に答える 2

1

After some more researching, I'm going to try and use Lucene.Net for my movie-title search engine, and not rely on Full-Text Searching in SQL Server 2005. Early testing shows that the results have been better and more relevant with Lucene. A search for "batman" returns the following partial result-set:

  • Batman
  • Batman Begins
  • Batman Returns
  • Batman and Robin: Batman Takes Over
  • Batman Beyond: A Touch of Curaré
  • Batman Beyond: Babel
  • The Batman: Season 02
  • The Batman: Topsy Turvy
  • Batman and Robin: Tunnel of Terror
  • Batman Beyond [Animated TV Series]
  • The New Adventures of Batman: Curses! Oiled Again!
  • The New Adventures of Batman: This Looks Like a Job for Bat-Mite!
于 2008-11-18T15:00:26.370 に答える
0

SQL Server Full Text も同じように機能すると思いますが、キーワードの作成方法を理解する必要があります。特に索引付けに関しては、Lucene と同じではありません。スケーラビリティと機能の点で、SQL Server の方が優れていることがわかると思います。特に、SQL 2008 はエンジンの一部になっています。

于 2008-12-02T20:52:45.470 に答える