Наиболее близкое соответствие для полнотекстового поиска
-
19-08-2019 - |
Вопрос
Я пытаюсь реализовать внутренний поиск на своем веб-сайте, который может указать пользователям правильное направление в случае, если они неправильно наберут слово, что-то вроде "ты имел в виду :в поиске Google.
У кого-нибудь есть идея, как можно выполнить такой поиск?Как мы можем установить релевантность слова или фразы, которые, как мы предполагаем, пользователь намеревался найти?
- я использую asp.net и sql server 2005 с FTS (FullTextSearch)
Спасибо
Решение
Вы могли бы использовать алгоритм для определения сходства строк, а затем предложить другую строку из вашего поискового индекса с точностью до определенного различия.
Одним из таких алгоритмов является Расстояние Левенштейна.
Однако не забывайте о поиске существующих решений.Я думаю, например Ясный имеет возможность поиска похожих строк.
Кстати, вот соответствующий пост на эту тему: Как работает запрос Google “Вы имели в виду?” Алгоритм работает?
Другие советы
Это делается путем запроса с помощью регулярного выражения ближайших ключевых слов, которые соответствуют фразе.
Здесь это отличная статья, которая может вам помочь.
С помощью T-SQL вы можете использовать SOUNDEX
функция для сравнения слов фонетически.
Если вы возьмете данные, введенные пользователями, а затем сравните их с другими словами в вашей базе данных с помощью кода soundex, вы должны быть в состоянии составить список "вы имеете в виду"?слова.
Например.
select SOUNDEX('andrew')
select SOUNDEX('androo')
оба будут выдавать один и тот же результат (A536).
В наши дни существуют алгоритмы получше, но soundex встроен в sql server.
Самый простой подход, который я могу придумать, - это написать функцию, которая возвращает степень несоответствия между двумя словами, и вы перебираете все слова и находите лучшие.
Я сделал это с помощью метода ветвления и привязки.Позвольте мне откопать код:
bool matchWithinBound(char* a, char* b, int bound){
// skip over matching characters
while(*a && *b && *a == *b){a++; b++;}
if (*a==0 && *b==0) return true;
// if bound too low, quit
if (bound <= 0) return false;
// try assuming a has an extra character
if (*a && matchWithinBound(a+1, b, bound-1)) return true;
// try assuming a had a letter deleted
if (*b && matchWithinBound(a, b+1, bound-1)) return true;
// try assuming a had a letter replaced
if (*a && *b && matchWithinBound(a+1, b+1, bound-1)) return true;
// try assuming a had two adjacent letters swapped
if (a[0] && a[1]){
char temp;
int success;
temp = a[0]; a[0] = a[1]; a[1] = temp;
success = matchWithinBounds(a, b, bound-1);
temp = a[0]; a[0] = a[1]; a[1] = temp;
if (success) return true;
}
// can try other modifications
return false;
}
int DistanceBetweenWords(char* a, char* b){
int bound = 0;
for (bound = 0; bound < 10; bound++){
if (matchWithinBounds(a, b, bound)) return bound;
}
return 1000;
}
почему вы не используете Google power?, вы можете воспользоваться их сервисом suggest
здесь является примером на c#