2

sql-sever2008dbの結果を使用してjQuery-UIオートコンプリートを使用して検索候補に取り組んでいます。テストにAdventureWorksDBProductsテーブルを使用する。この例では、2つのフィールドを検索したいと思います。製品番号と名前。

私はこれに関して以前に2つの質問をしました...ここここ

そして、これまでのところ、これを思いついたのです...

CREATE procedure [dbo].[procProductAutoComplete]
(
    @searchString nvarchar(100)
)
as
begin

    declare @param nvarchar(100);
    set @param = LOWER(@searchString);

WITH Results(result)
AS
(
    select TOP 10 Name as 'result'
    from Production.Product 
    where LOWER(Name) like '%' + @param + '%' or (0 <= dbo.lvn(@param, LOWER   (Name), 6))
    union
    select TOP 10 ProductNumber as 'result'
    from Production.Product
    where LOWER(ProductNumber) like '%' + @param + '%' or (0 <= dbo.lvn(@param,  LOWER(ProductNumber), 6))
)

SELECT TOP 20 * from Results

end;

私の問題は結果の順序付けです...正しい結果が得られていますが、名前または製品番号で並べ替えられているだけで、入力文字列とは関係ありません...

たとえば、「BZ-」で始まる製品番号を検索できます。リストの他の場所でより関連性の高い結果が得られますが、返される上位の結果は「A」で始まるProductNumです。

検索文字列との関連性の観点から結果を並べ替えるためのアイデアはありますか?

編集:

ここにあるlevenschtein距離のtql実装に関して(前の質問にリンクされています)...

関数に送信するMAX値を決定するための最良の方法は何でしょうか(上記の例では6)

与えられたデータセットに対してうまく機能すると思われるものに基づいて、任意の値を選択するのが最善でしょうか?または、入力文字列の長さに基づいて動的に調整するのが最善でしょうか。

私の最初の考えは、toの値はsearchStringの長さに非常に比例する必要があるということでした...検索文字列が大きくなり、より具体的になるにつれて、許容範囲が減少します...思考??

4

2 に答える 2

0

SQL Server を使用する場合は、全文検索機能が適しているようです。

于 2011-01-06T12:35:49.993 に答える
0

関連性は の結果ですdbo.lvn()。ある文字列を別の文字列に変換するために必要な操作の量を返します。したがって、答えは簡単です。

ORDER BY dbo.lvn(@param, LOWER (Name), 6)

ただし、これはLIKE関連値を返さないため、 と組み合わせて使用​​することはできません。しかし、LIKE の使用法はまったくお勧めできません。誰かが「歯磨き粉」を購入するために「歯」を傾けている場合、提案として「Bluetooth」を取得します。

devlim を高速化するには、 https ://stackoverflow.com/a/14261807/318765 を参照してください。

于 2014-08-13T15:08:39.627 に答える