SQL полнотекстовый поиск против "как" - PullRequest
29 голосов
/ 26 января 2009

Допустим, у меня есть довольно простое приложение, которое позволяет пользователям хранить информацию на своих DVD-дисках (название, актеры, год, описание и т. Д.), И я хочу, чтобы пользователи могли искать свою коллекцию по любому из этих полей (например, Киану Ривз "или" Матрица "будут действительными поисковыми запросами).

В чем преимущество использования полнотекстового поиска SQL по сравнению с простым разбиением запроса на пробелы и выполнением нескольких предложений "LIKE" в операторе SQL? Он просто работает лучше или на самом деле дает более точные результаты?

Ответы [ 9 ]

27 голосов
/ 26 января 2009

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

В некоторых случаях LIKE будет более точным, поскольку LIKE "% The%" AND LIKE "% Matrix" выберет "Матрицу", но не "Matrix Reloaded", тогда как полнотекстовый поиск будет игнорировать "The" и возвращать оба. Это сказало бы, что оба, вероятно, были бы лучшим результатом.

9 голосов
/ 26 января 2009

Полнотекстовые индексы (которые являются индексами) намного быстрее, чем при использовании LIKE (который, по сути, каждый раз проверяет каждую строку). Однако, если вы знаете, что база данных будет небольшой, может не потребоваться производительность, чтобы использовать полнотекстовые индексы. Единственный способ определить это с помощью некоторого интеллектуального усреднения и некоторого тестирования на основе этой информации.

Точность - это другой вопрос. Полнотекстовая индексация позволяет вам делать несколько вещей (взвешивание, автоматическое сопоставление еды / еды / еды и т. Д.), Которые вы не могли бы реализовать в любой разумный период времени, используя LIKE. Реальный вопрос в том, нужны ли вам эти функции.

Не читая описание этих функций в полнотекстовой документации, вы действительно не узнаете, как поступить. Итак, читайте!

Кроме того, некоторые базовые тесты (вставка набора строк в таблицу, возможно, с использованием какого-либо общедоступного словаря в качестве источника слов) помогут вам принять решение.

7 голосов
/ 28 октября 2010

Полнотекстовый поиск гораздо быстрее. Особенно при работе с большим количеством данных в различных столбцах.

Кроме того, у вас будет поддержка поиска для конкретного языка. Например. немецкие умлауты, такие как «ü» в «über», также можно найти при хранении как «ueber». Также вы можете использовать синонимы, где вы можете автоматически расширять поисковые запросы или заменять или заменять определенные фразы.

В некоторых случаях LIKE будет более точным с как "% The%" и как "% Matrix" выберет "Матрицу", но не "Matrix Reloaded", тогда как полный текст поиск игнорирует "The" и возвращает и то и другое. Тем не менее оба был лучший результат.

Это не правильно. Синтаксис полнотекстового поиска позволяет указать, «как» вы хотите искать. Например. используя оператор CONTAINS , вы можете использовать точное совпадение терминов, а также нечеткое сопоставление, веса и т. д.

Так что, если у вас есть проблемы с производительностью или вы хотите обеспечить более "похожий на Google" поиск, воспользуйтесь полнотекстовой поисковой системой. Это также очень легко настроить.

6 голосов
/ 15 июля 2011

Всего несколько заметок:

  1. LIKE может использовать поиск по индексу, если вы не начинаете LIKE с%. Пример: LIKE 'Santa M%' хорош! НРАВИТСЯ '% Maria' плохо! и может вызвать сканирование таблицы или индекса, потому что это не может быть проиндексировано стандартным способом.

  2. Это очень важно. Обновления полнотекстовых индексов являются асинхронными. Например, если вы выполняете INSERT для таблицы, за которой следует SELECT с полнотекстовым поиском, где вы ожидаете появления новых данных, вы можете не получить данные сразу. В зависимости от вашей конфигурации вам, возможно, придется подождать несколько секунд или день. Обычно полнотекстовые индексы заполняются, когда в вашей системе мало запросов.

3 голосов
/ 26 января 2009

Это будет работать лучше, но если у вас нет много данных, вы не заметите эту разницу. Индекс полнотекстового поиска SQL позволяет вам использовать более сложные операторы, чем простая операция «LIKE», но если все, что вы делаете, является эквивалентом операции LIKE для вашего полнотекстового индекса, то ваши результаты будут такими же.

0 голосов
/ 21 апреля 2017

Если вы не просто ищете английское слово, скажем, что вы ищете китайское слово, то то, как ваш fts токенизирует слова, сильно изменит ваш поиск, как я привел здесь пример https://stackoverflow.com/a/31396975/301513. Но я не знаете, как sql server использует токены для китайских слов, делает ли это хорошую работу для этого?

0 голосов
/ 20 декабря 2015

К FullTextSearch в SQL Server как LIKE
Во-первых, вы должны создать StopList и назначить его для вашей таблицы

CREATE FULLTEXT STOPLIST [MyStopList];
GO
ALTER FULLTEXT INDEX ON dbo.[MyTableName] SET STOPLIST [MyStopList]
GO

Во-вторых, используйте следующий скрипт tSql:

SELECT * FROM dbo.[MyTableName] AS mt
WHERE CONTAINS((mt.ColumnName1,mt.ColumnName2,mt.ColumnName3), N'"*search text s*"')
0 голосов
/ 26 января 2009

Вы можете получить несколько лучшие результаты или, по крайней мере, иметь более легкую реализацию с полнотекстовой индексацией. Но это зависит от того, как вы хотите, чтобы это работало ...

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

0 голосов
/ 26 января 2009

Представьте себе, если вы позволите вводить заметки / описания на DVD. В этом случае будет хорошо разрешить поиск по описаниям. Полнотекстовый поиск в этом случае сделает работу лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...