Google Style Search Предложения с Левенштейном Редактировать расстояние - PullRequest
2 голосов
/ 23 декабря 2010

Хорошо, ребята, работающие над поисковыми предложениями с помощью jQuery-UI AutoComplete с результатами из sql-sever 2008 db.Использование таблицы продуктов AdventureWorks DB для тестирования.Я хочу искать по 2 полям в этом примере.ProductNumber и Name.

Ранее я задавал 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-", а верхние возвращаемые результаты - ProductNums, начинающиеся с "A", хотя я получаю более релевантные результаты в других местах списка ..

какие-либо идеи для сортировки результатов с точки зрения релевантности для строки поиска ??

РЕДАКТИРОВАТЬ:

в отношении tql реализации найденного расстояния Левенштейна здесь (связано с предыдущим вопросом) ...

Мне интересно, как лучше определить значение MAX для отправки в функцию (6 в моем примере выше)

Будет ли этолучше всего выбрать произвольное значениена основании того, что «кажется» хорошо работает для моего данного набора данных?или было бы лучше настроить его динамически в зависимости от длины входной строки ...

Вначале я считал, что значение должно быть неоправданно пропорционально длине searchString ... так какстрока поиска растет и становится более конкретной .. терпимость уменьшается ... мысли ??

Ответы [ 2 ]

0 голосов
/ 13 августа 2014

Актуальность является результатом dbo.lvn(). Он возвращает количество операций, необходимых для преобразования одной строки в другую. Так что ответ прост:

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

Но это не сработает в сочетании с LIKE, поскольку не возвращает значения релевантности. Но использование LIKE не очень хорошая идея. Если кто-то набивает «зуб», чтобы купить «зубную пасту», он получает «блютуз» в качестве предложения.

Чтобы сделать devlim быстрее, читайте здесь: https://stackoverflow.com/a/14261807/318765

0 голосов
/ 06 января 2011

Функция полнотекстового поиска, похоже, подходит при использовании SQL Server

...