Можно ли использовать полнотекстовый индекс для поиска строк с ближайшим соответствием? Что делает статистическая семантика при полнотекстовом индексировании

Я ищу полнотекстовые индексы SQL Server 2016, и они отлично подходят для поиска нескольких слов, содержащих строки.

Когда я пытаюсь составить полнотекстовый индекс, он показывает Statistical Semantics в виде флажка. Что делает статистическая семантика?

Более того, я хочу узнать, имели ли вы в виду запросы

Например, допустим, у меня есть запись как house. Пользователь вводит hause

Могу ли я использовать полнотекстовый индекс, чтобы вернуть hause как наиболее близкое соответствие и показать пользователю, эффективно ли вы имели в виду дом? Спасибо

Я пробовал soundex, но результаты ужасные

Он возвращает так много несвязанных слов

И поскольку в моей базе данных так много записей, и мне нужны очень быстрые результаты, мне нужно что-то, что SQL-сервер поддерживает изначально.

Любые идеи? Есть ли способ добиться этого с помощью индексов?

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

У меня уже есть план в голове. Сохранение ненайденных результатов в базе данных и автономный расчет ближайших совпадений. И используя их как кеш. Однако мне интересно, может ли существовать какое-либо возможное онлайн-решение? Учтите, что будет более 100 миллионов записей nvarchar


person MonsterMMORPG    schedule 22.03.2017    source источник
comment
Не существует версии SQL Server 2017 - у нас есть 2012, 2014, 2016, а также vNext в разработке - о какой из них вы на самом деле имеете в виду ??   -  person marc_s    schedule 22.03.2017
comment
@marc_s 2016 исправил мою опечатку.   -  person MonsterMMORPG    schedule 22.03.2017


Ответы (1)


Короткий ответ: нет, полнотекстовый поиск не может искать похожие, но разные слова.

Полнотекстовый поиск использует стеммеры и файлы тезауруса:

stemmer генерирует флективные формы конкретного слова на основе правил этого языка (например, бег, бег и бегун - это различные формы слова бег).

Полнотекстовый поиск тезаурус определяет набор синонимов для определенного языка.

Как стеммеры, так и тезаурус можно настраивать, и вы можете легко получить совпадение FT house для поиска по hause, но только, если вы добавили hause в качестве синонима для house. Очевидно, что это не решение, так как требует, чтобы вы добавляли все возможные опечатки в качестве синонима ...

Семантический поиск - это другой тематике, он позволяет искать документы, семантически близкие к данному примеру.

Вам нужно найти записи, для которых заданное слово (также известное как. "нечеткий" поиск). Я не знаю ни одной техники для создания индекса, который отвечал бы на поиск Левенштейна. Если вы хотите просмотреть всю таблицу для каждого термина, T-SQL и CLR-реализации Левенштейна существует.

person Remus Rusanu    schedule 25.03.2017
comment
ты за ответ. да, я знаю об алгоритмах, но, как вы также заметили, они требуют полного сканирования таблицы, чего нет в моем онлайн-приложении. так вы говорите, что в SQL-сервере нет такого индекса или функции, верно? из этого ответа я также предполагаю, что Google использует кешированные результаты на основе автономного обучения? - person MonsterMMORPG; 26.03.2017
comment
Что вы можете попробовать, так это построить все слова, которые находятся на уровне Левенштейна 1,2,3 из данного слова (возможно и разумно быстро, если используется небольшой набор символов, например, латинский, а не весь Юникод), а затем искать все эти "близкие" совпадения. - person Remus Rusanu; 26.03.2017
comment
Также вы можете добавить в таблицу любое слово, которое не соответствует, и периодически создавать все «близкие» слова для этих несоответствующих слов и индексировать их. В следующий раз будет найдено. Со временем вы устраните все распространенные опечатки. - person Remus Rusanu; 26.03.2017
comment
все слова отношения породили бы так много отношений. однако это также то, что я думаю о том, чтобы позже сохранить ненайденные слова и вычислить их ближайшие пары в автономном режиме. Я бы хотел, чтобы в SQL была какая-то система индексов, но технически это кажется невозможным. - person MonsterMMORPG; 26.03.2017
comment
Есть также эвристика, например предположение, что первая буква верна. А также создание всех альтернатив может быть значительно сокращено путем применения общих ошибок опечаток (например, на основе раскладки клавиатуры) - person Remus Rusanu; 26.03.2017
comment
Итак, если первая буква верна, какой метод я могу применить на основе индексов? - person MonsterMMORPG; 27.03.2017
comment
Предполагая, что первая буква верна, вы можете сканировать только эту букву, предполагая индекс на этом слове. - person Remus Rusanu; 27.03.2017
comment
например, можно использовать индекс, если он имеет форму LIKE 'A%' - person user1327961; 30.03.2017