0

мне нужно сделать нечеткий поиск транслитерацией персонажей, например:транслитерации и нечеткий поиск, как предложения Google

У меня есть приложения ASP.NET, базы данных, которая содержит таблицу со списком испанского языка слова (200 000 записей), у меня также есть страница с полем ввода. Дело в том, что я не знаю испанского языка, и я не знаю, как записать слова поиска по-испански, но я знаю, как это звучит. Поэтому в текстовом поле я вводим слово поиска, например «красивый», но в записи err - «prekieso», и мне нужно получить из базы данных, получив правильную версию: «precioso».

Как это можно реализовать? Другими словами, мне нужно что-то похожее на предложения Google ...

ответ

0

Я думаю, что вам нужно здесь является проверка орфографии функциональность как этот: http://www.codeproject.com/KB/string/netspell.aspx

Google как функциональность это гораздо более продвинутый, хотя и не будет быть легким в применении: How does the Google "Did you mean?" Algorithm work?

надеюсь, что эта помощь.

0

хранимой процедуры/функции, алгоритм вычисляет расстояние Левенштейна:

USE [**dbname**] 
GO 
/****** Object: UserDefinedFunction [dbo].[levenshtein] Script Date: 05/27/2013 17:54:05 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[levenshtein](@left varchar(100), @right varchar(100)) 
    returns int 
as 
BEGIN 
    DECLARE @difference int, @lenRight int, @lenLeft int, @leftIndex int, @rightIndex int, @left_char char(1), @right_char char(1), @compareLength int 
    SET @lenLeft = LEN(@left) 
    SET @lenRight = LEN(@right) 
    SET @difference = 0 
    If @lenLeft = 0 
    BEGIN 
     SET @difference = @lenRight GOTO done 
    END 
    If @lenRight = 0 
    BEGIN 
     SET @difference = @lenLeft 
     GOTO done 
    END 
    GOTO comparison 

    comparison: 
    IF (@lenLeft >= @lenRight) 
     SET @compareLength = @lenLeft 
    Else 
     SET @compareLength = @lenRight 
    SET @rightIndex = 1 
    SET @leftIndex = 1 
    WHILE @leftIndex <= @compareLength 
    BEGIN 
     SET @left_char = substring(@left, @leftIndex, 1) 
     SET @right_char = substring(@right, @rightIndex, 1) 
     IF @left_char <> @right_char 
     BEGIN -- Would an insertion make them re-align? 
     IF(@left_char = substring(@right, @rightIndex+1, 1))  
      SET @rightIndex = @rightIndex + 1 
     -- Would an deletion make them re-align? 
     ELSE 
      IF(substring(@left, @leftIndex+1, 1) = @right_char) 
       SET @leftIndex = @leftIndex + 1 
       SET @difference = @difference + 1 
     END 
     SET @leftIndex = @leftIndex + 1 
     SET @rightIndex = @rightIndex + 1 
    END 
    GOTO done 

    done: 
     RETURN @difference 
END 

ссылающееся:

select 
dbo.edit_distance('Fuzzy String Match','fuzzy string match'), 
dbo.edit_distance('fuzzy','fuzy'), 
dbo.edit_distance('Fuzzy String Match','fuzy string match'), 
dbo.edit_distance('levenshtein distance sql','levenshtein sql server'), 
dbo.edit_distance('distance','server') 

или:

SELECT [Name] 
FR OM [tempdb].[dbo].[Names] 
WHERE dbo.edit_distance([Name],'bozhestvennia') <= 3