0

Web サイト用の辞書を作成しようとしています。FREETEXTTable & Rank DESC を使用して「サーバー」を検索すると、次のように返されます。

  1. ネームサーバー - 人間が読める名前をマッピングするプログラムまたはサーバー..
  2. サーバー - サービスを提供する人。ウェイトレスまたはウェイター。
  3. サーバー - 皿のトレイ。救済者。4...

「サーバー」は明らかに「ネームサーバー」よりも「サーバー」に近いです。ランキングを修正するにはどうすればよいですか?

さらに悪い一致があるため、ASC に戻すことはできません。「神」の上位 3 件の結果は、「神の行為」、「神の子羊」、「ル神」です。

編集:混乱して申し訳ありません。nameserver、server、server.. は「word」という単一の列にあり、これは全文検索で照会される列です。定義は次の列「定義」にあり、クエリ結果として返されます。

4

2 に答える 2

0

ある時点でこれを行うために PATINDEX 関数を使用しました。次のようなもの:

SELECT
    Word,
    Definition
FROM
    FREETEXTTABLE(Dictionary, Word, @search, 20) AS Matches
    INNER JOIN Dictionary ON
        Matches.Key = Dictionary.ID
ORDER BY
    CASE PATINDEX('%' + @search + '%', Word) 
        WHEN -1 THEN 1000
        ELSE PATINDEX('%' + @search + '%', Word) 
    END

フルテキスト インデックスを使用してより小さな結果セット (この場合は最大 20) を取得しているため、パフォーマンスはそれほど悪くありません。PATINDEX は、式内の文字列を検索します。検索文字列が式内に存在しない場合は、-1 を返します。これは、定義も検索している場合、検索が類義語または語幹語に一致する場合 (例: "took" を検索すると "take" が返される)、または検索に複数の単語が含まれる場合に発生する可能性があります。CASE ステートメントは、これらの結果を最後まで並べ替えます。

于 2012-04-29T21:58:25.750 に答える
0

ユニオンを使用して、結果の順序付けの問題を解決できると思います..

お気に入り

select * from your_table_name where col_name = 'server'
union 
select * from your_table_name where col_name like '%server%' order by col1,col2..

このクエリは、全文検索で最初の行を表示し、次に部分検索で表示する必要があります..

col_name明確化..私は、あなたがあなたの言葉のために持っているものを列名について言うつもりだったことに注意してください..あなたのテーブル構造は..

辞書 - ( c_word 、 c_definition 、 c_synonyms )

次に、クエリを次のように変更する必要があります

select * from Dictionary where c_word = 'server'
union 
select * from Dictionary where c_word like '%server%' order by c_definition,c_synonyms

このクエリでは、c_word の値が「server」という単語と完全に一致する場所が最初に表示され、続いて部分検索が表示されます。

'server'動的クエリの場合 - search の要求されたキーワードを取得している変数に置き換える必要があります。

于 2012-04-21T13:44:41.197 に答える