SQL Fuzzy Matching
Надеюсь, я не повторяю этот вопрос. Я сделал поиск здесь и Google, прежде чем размещать здесь.
Я работаю в электронном магазине с SQL Server 2008R2 с включенным полным текстом.
Мои требования,Существует таблица продуктов с названием продукта, OEM-кодами, моделью, в которую входит этот продукт. Все в тексте.Я создал новый столбец с именем TextSearch. Это объединяет значения «Наименование продукта», «Код производителя» и «Модель», в которые входит данный продукт. Эти значения разделяются запятыми.Когда клиент вводит ключевое слово, мы запускаем поиск по столбцу TextSearch, чтобы найти продукты. Смотрите соответствующую логику ниже.Я использую Hybrid Fulltext и обычно люблю делать поиск. Это дает более релевантные результаты. Все запросы, выполненные во временную таблицу и отличия были возвращены.
Соответствующая логика,
Запустите следующий SQL, чтобы получить соответствующий продукт, используя полный текст. Но @Keywords будет предварительно обработан. Сказать 'CLC 2200 ' будет изменен наCLC * AND 2200 * '
ВЫБЕРИТЕ Id ИЗ dbo.Product, ГДЕ СОДЕРЖИТ (TextSearch, @ Ключевые слова)
Другой запрос будет выполняться с использованием обычного лайка. Так 'CLC 2200 ' будет предварительно обработан доTextSearch как% clc% И TextSearch как% 2200% ', Это просто потому, что полнотекстовый поиск не будет искать шаблоны перед ключевыми словами. Например, он не вернетсяpclc 2200 '.
ВЫБЕРИТЕ Id ИЗ dbo.Product ГДЕ TextSearch like '% CLC%» И TextSearch, как '% 2200%»
Если шаг 1 и 2 не сделалиt вернуть любые записи, будет выполнен следующий поиск. Значение 135 было точно настроено мной для получения более релевантных записей.
ВЫБЕРИТЕ p.id ИЗ dbo.Product В КАЧЕСТВЕ ВНУТРЕННЕГО СОЕДИНЕНИЯ FREETEXTTABLE (product, TextSearch, @ Keywords) AS r ON p.Id = r. [КЛЮЧ] ГДЕ r.RANK> 135
Все вышеперечисленное прекрасно работает с разумной скоростью и возвращает релевантные продукты по ключевым словам.
Но я ищу дальнейшее улучшение, когда продукт вообще не найден.
Скажи, если клиент ищет "CLC 2200npk ' и этот продукт не былтам, я должен был показать следующий очень близкоCLC 2200 '.
Пока я пытался использоватьСаундэкс () функция. Купить вычисление значения soundex для каждого слова в столбце TextSearch и сравнение со значением soudex для ключевого слова. Но это возвращает слишком много записей и тоже медленно.
пример, 'CLC 2200npk ' вернет продукты, такие какCLC 1100 ' и т.д. Но это нене будет хорошим результатом. Как это не близко к CLC 2200npk
Есть еще один хорошийВот, но это использует функции CLR. Но я не могу установить функции CLR на сервере.
Так что моя логика должна быть,
если 'CLC 2200npk ' не найден, показать рядомCLC 2200 ' если 'CLC 2200 ' не найден, показать рядомCLC 1100 '
ВопросыВозможно ли совпадение как предложено?Если бы мне нужно было исправить орфографию и поиск, что было бы хорошим способом? Все наши списки продуктов на английском языке.Есть ли UDF или SP 's, чтобы соответствовать текстам как мои предложения?Благодарю.