1 つのレコードのテキスト フィールドを SQL サーバーの他のすべてのレコードと比較して、たとえば最も関連性の高い上位 5 つのレコードを返すにはどうすればよいでしょうか?
私が求めている機能の例は、現在表示されている投稿に関連する投稿へのリンクのリストを生成する、Wordpress 用のさまざまな関連投稿プラグインです。
乾杯、イアン
1 つのレコードのテキスト フィールドを SQL サーバーの他のすべてのレコードと比較して、たとえば最も関連性の高い上位 5 つのレコードを返すにはどうすればよいでしょうか?
私が求めている機能の例は、現在表示されている投稿に関連する投稿へのリンクのリストを生成する、Wordpress 用のさまざまな関連投稿プラグインです。
乾杯、イアン
これらの応答をありがとう。私は参照されている関数に精通していますが、それらが必要なことを実行するかどうかはわかりません。例えば:
SELECT P.id, 'Product' AS Type, FT.rank, C.url + '/' + P.url AS url, longTitle, shortTitle, P.description
FROM Products P
INNER JOIN CONTAINSTABLE (Products, (longTitle, shortTitle), '"my text content"') AS FT ON P.id = FT.[key]
LEFT JOIN Product_Categories PC ON P.id = PC.productID
LEFT Join Categories C ON C.id = PC.categoryID
WHERE [primary] = 1
ORDER BY rank DESC
正確なフレーズ「mytextcontent」を含む行のみを返します-「text」のみを含む行を返す必要がありますが、ランクは低くなります。次のようにクエリを変更した場合:
SELECT P.id, 'Product' AS Type, FT.rank, C.url + '/' + P.url AS url, longTitle, shortTitle, P.description
FROM Products P
INNER JOIN CONTAINSTABLE (Products, (longTitle, shortTitle), '"my" or "text" or "content"') AS FT ON P.id = FT.[key]
LEFT JOIN Product_Categories PC ON P.id = PC.productID
LEFT Join Categories C ON C.id = PC.categoryID
WHERE [primary] = 1
ORDER BY rank DESC
行数は増えましたが、3つの単語すべてを含む行は、1つの単語を含む行よりも明らかに上位にランク付けされていないようです。
それ以上の考えはありますか?
以下は、優れた Robert Cain の言葉です。
CONTAINSTABLE を使用する必要があります。これは、並べ替えに使用できる RANK 列を返します。
SELECT TOP 5 [Key] FROM CONTAINSTABLE ([YourFullText],'SomethingToSearch')
ORDER BY [RANK] DESC