10

全文検索クエリで、特定の列により高い重みを割り当てたいと考えています。次のクエリを検討してください。

SELECT Key_Table.RANK, FT_Table.* FROM Restaurants AS FT_Table
INNER JOIN FREETEXTTABLE(Restaurants, *, 'chilly chicken') AS Key_Table
ON FT_Table.RestaurantID = Key_Table.[KEY]
ORDER BY Key_Table.RANK DESC

ここで、結果で [名前] 列の重みを高くしたいと考えています (名前、キーワード、および場所は全文索引付けされています)。現在、結果が 3 つの列のいずれかにある場合、ランクは影響を受けません。

たとえば、「Chilly Chicken」という名前の行を、別の名前の「Chilly Chicken」というキーワードの行よりも上位にランク付けしたいと考えています。

編集:

私は、ContainsTable を使用することに熱心ではありません。これは、フレーズ (Chilly AND Chicken など) を分離することを意味し、考えられるすべての組み合わせ (Chilly AND Chicken、Chilly OR Chicken など) を検索する必要があるためです。 FTS エンジンは、どの結果が最も一致するかを自動的に判断します。FREETEXT はこのようにうまく機能すると思います。

CONTAINS/CONTAINSTABLE の仕組みを誤解していた場合は、お詫び申し上げます。

4

1 に答える 1

7

最善の解決策は、ContainsTable を使用することです。ユニオンを使用して、3 つの列すべてを検索し、検索された列を示すために使用される整数を追加するクエリを作成します。結果をその整数で並べ替えてから、順位を下げます。

ランクはSQLサーバーの内部であり、調整できるものではありません。

ランクを整数で割って、返されたランクを操作することもできます(名前は 1 で割り、キーワードと場所は 2 以上で割ります)。それにより、さまざまなランキングが表示されます。

SQL の例
をいくつか示します。

    SELECT 1 AS ColumnLocation, Key_Table.Rank, FT_Table.* FROM レストラン AS FT_Table
 INNER JOIN ContainsTable(Restaurant, Name, 'chilly Chicken') AS Key_Table ON
FT_Table.RestaurantId = Key_Table.[キー]

UNION SELECT 2 AS ColumnLocation, Key_Table.Rank, FT_Table.* FROM レストラン AS FT_Table
 INNER JOIN ContainsTable(Restaurant, Keywords, 'chilly Chicken') AS Key_Table ON
FT_Table.RestaurantId = Key_Table.[キー]

UNION SELECT 3 AS ColumnLocation, Key_Table.Rank, FT_Table.* FROM レストラン AS FT_Table
 INNER JOIN ContainsTable(Restaurant, Location, 'chilly Chicken') AS Key_Table ON
FT_Table.RestaurantId = Key_Table.[キー]

ORDER BY 列の場所、ランク DESC

実稼働環境では、クエリの出力をテーブル変数に挿入して、結果を返す前に追加の操作を実行します (この場合は必要ない場合があります)。また、* の使用は避け、本当に必要な列だけをリストしてください。

編集:ContainsTableの使用については正しいです。キーワードを「chilly *」AND「chicken *」に変更する必要があります。これは、入力フレーズをトークン化するプロセスを使用して行います。それをしたくない場合は、上記の ContainsTable のすべてのインスタンスを FreeTextTable に置き換えるだけで、クエリは同じように機能します。

于 2008-10-13T21:23:35.193 に答える