Как найти строки, которые похожи на данную строку в SQL-сервере? - PullRequest
2 голосов
/ 26 декабря 2011

У меня есть таблица SQL-сервера, которая содержит несколько строковых столбцов.Мне нужно написать приложение, которое получает строку и искать похожие строки в таблице SQL-сервера.

Например, если я укажу "مختار" или "مختر" в качестве входной строки, я должен получить их из SQLтаблица:

1 - مختاری
2 - شهاب مختاری
3 - شهاب الدین مختاری

Я искал в сети решение, но ничего полезного не нашел.Я прочитал этот вопрос , но это мне не поможет, потому что:

  1. Я использую MS SQL Server, а не MySQL
  2. содержимое моей таблицы написано на персидском языкепоэтому я не могу использовать расстояние Левенштейна и аналогичные методы
  3. Я предпочитаю решение только на SQL Server, а не решение на основе индексации или демона.

Лучшим решением будет решениечто помогает нам сортировать результаты по сходству, но это необязательно.

У вас есть какие-либо предложения по этому поводу?

Спасибо

Ответы [ 5 ]

4 голосов
/ 26 декабря 2011

MSSQL поддерживает LIKE, что, похоже, должно работать. Есть ли причина, по которой он не подходит для вашей программы?

SELECT * FROM table WHERE input LIKE '%مختار%'
3 голосов
/ 27 декабря 2011

Хм ... учитывая, что вы читали другой пост, который вы, вероятно, уже знаете об операторе like ... может быть, ваша проблема в "получении строки и поиске чего-то подобного"?

--This part searches for a string you want

declare @MyString varchar(max)

set @MyString = (Select column from table
where **LOGIC TO FIND THE STRING GOES HERE**)


--This part searches for that string

select searchColumn, ABS(Len(searchColumn) - Len(@MyString)) as Similarity
from table where data LIKE '%' + @MyString + '%'
Order by Similarity, searchColumn

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

Надеюсь, это поможет = -)

1 голос
/ 26 декабря 2011

Общая проблема заключается в том, что в языках, где одна и та же буква имеет различную письменную форму в начале, середине и конце слова и, следовательно, - разные коды - мы можем попытаться использовать определенные персидские сопоставления, но Вообще это не поможет.

Второй вариант - использовать возможности SQL FTS, но, опять же, если у него нет специального языкового модуля для языка, это гораздо менее полезно.

И самый общий способ - использовать свою собственную языковую обработку - что является очень сложной задачей вообще. Следующие ключевые слова и Google могут помочь понять размер проблемы: DLP, слова и термины, би-граммы, н-граммы, грамматика и морфология перегиба

1 голос
/ 26 декабря 2011

Помимо оператора like, вы можете использовать условие WHERE instr(columnname, search) > 0; Однако это, как правило, медленнее. Что он делает, это возвращает начальную позицию строки в другой строке. таким образом, если поиск в ABCDEFG для CD, он вернет 3. 3> 0, поэтому запись будет возвращена. Однако, в описанном вами случае, похоже, лучшее решение.

0 голосов
/ 26 ноября 2012

Попробуйте использовать встроенные функции Soundex () и Difference (). Я надеюсь, что они хорошо работают на персидском языке.

Посмотрите на следующую ссылку: http://blog.hoegaerden.be/2011/02/05/finding-similar-strings-with-fuzzy-logic-functions-built-into-mds/

Функция Similarity () помогает сортировать результаты по сходству (как вы задали в своем вопросе), а также возможно использование алгоритмов, отличных от расстояния редактирования Левенштейна, зависит от значения для алгоритма @method:

0 Алгоритм редактирования Левенштейна

1 Алгоритм коэффициента подобия Жакара

2 Форма алгоритма расстояния Яро-Винклера

3 Алгоритм самой длинной общей подпоследовательности

...