Ответ 1
К сожалению, CONTAINS поддерживает только подстановочные знаки префикса:
CONTAINS(*, '"book*"')
Я пытаюсь оборачивать голову тем, как искать что-то, что появляется в середине слова/выражения - что-то вроде поиска "LIKE% book%", но в полнотекстовом каталоге SQL Server (2005).
Как я могу это сделать? Похоже, что оба CONTAINS
и FREETEXT
действительно не поддерживают подстановочный знак в начале выражения поиска - может ли это быть действительно?
Я бы предположил, что FREETEXT(*, "book")
найдет что-нибудь с "книгой" внутри, включая "rebooked" или что-то в этом роде.
К сожалению, CONTAINS поддерживает только подстановочные знаки префикса:
CONTAINS(*, '"book*"')
Полнотекстовый поиск SQL Server основан на токенизации текста в слова. В качестве слова меньше единицы, поэтому самые маленькие вещи, которые вы можете искать, - это слова.
Вы можете использовать префиксные поиски, чтобы искать совпадения, которые начинаются с определенных символов, что возможно, потому что списки слов хранятся в алфавитном порядке и все сервер должен выполнить поиск по списку, чтобы найти совпадения.
Чтобы сделать то, что вы хотите, с предложением LIKE '%book%'
, вероятно, будет таким же быстрым (или медленным).
Если вы хотите сделать серьезный полный поиск текста, я бы (и имел) использовал Lucene.Net. Поиск в MS SQL Full Text никогда не работает так хорошо ни для чего другого, кроме основ.
Вот предложение, которое является обходным путем для этого ограничения подстановочных знаков. Вы создаете вычисленный столбец, содержащий один и тот же контент, но в обратном порядке в качестве столбца (ов), который вы ищете.
Если, например, вы выполняете поиск в столбце с именем ProductTitle, создайте столбец с именем ProductRev. Затем обновите значение этого поля "Расчетная спецификация столбца":
(обратное ([ProductTitle]))
Включите столбец "ProductRev" в свой поиск, и теперь вы сможете возвращать результаты, которые поддерживают подстановочный знак в начале слова. Удачи!
В полном тексте есть таблица, в которой перечислены все слова, найденные движком. Он должен иметь порядки меньше строк, чем таблица с полным текстом. Вы можете выбрать из этой таблицы "где поле типа" % book% ", чтобы получить все слова, в которых есть" книга". Затем используйте этот список для написания полнотекстового запроса. Это громоздко, но это сработает, и это будет нормально в отделе скорости. ОДНАКО, в конечном итоге вы используете полнотекстовый код неправильно, когда делаете это. Возможно, было бы лучше просвещать источник этих запросов функций о том, что делает полный текст. Вы хотите, чтобы они поняли, что нужно делать, чтобы они могли получить большую ценность из полнотекстового текста. Например, используйте только дикие карты в конце слова, что означает думать о словах в упорядоченном списке.
Почему бы не запрограммировать сборку на С#, чтобы вычислить все неоднократные префиксы. Например, если у вас есть текст "съесть красное мясо", вы можете хранить в поле "съесть его мясо" (обратите внимание, что нет необходимости добавлять "едят" и "снова" ), затем в этом поле используйте полнотекстовый поиск. Функция для этого может быть легко записана в Csharp
x) Я знаю, что это похоже... это рабочий стол x) Я знаю, что добавляю накладные расходы в insert/update.... только оправдано, если эти накладные расходы незначительны, кроме улучшения функции поиска x) Я знаю, что есть также накладные расходы по размеру сохраненных данных.
Но я довольно уверен, что будет довольно быстро