Полный текстовый каталог/индекс поиска% book%

Я пытаюсь оборачивать голову тем, как искать что-то, что появляется в середине слова/выражения - что-то вроде поиска "LIKE% book%", но в полнотекстовом каталоге SQL Server (2005).

Как я могу это сделать? Похоже, что оба CONTAINS и FREETEXT действительно не поддерживают подстановочный знак в начале выражения поиска - может ли это быть действительно?

Я бы предположил, что FREETEXT(*, "book") найдет что-нибудь с "книгой" внутри, включая "rebooked" или что-то в этом роде.

Ответы

Ответ 1

К сожалению, CONTAINS поддерживает только подстановочные знаки префикса:

CONTAINS(*, '"book*"')

Ответ 2

Полнотекстовый поиск SQL Server основан на токенизации текста в слова. В качестве слова меньше единицы, поэтому самые маленькие вещи, которые вы можете искать, - это слова.

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

Чтобы сделать то, что вы хотите, с предложением LIKE '%book%', вероятно, будет таким же быстрым (или медленным).

Ответ 3

Если вы хотите сделать серьезный полный поиск текста, я бы (и имел) использовал Lucene.Net. Поиск в MS SQL Full Text никогда не работает так хорошо ни для чего другого, кроме основ.

Ответ 4

Вот предложение, которое является обходным путем для этого ограничения подстановочных знаков. Вы создаете вычисленный столбец, содержащий один и тот же контент, но в обратном порядке в качестве столбца (ов), который вы ищете.

Если, например, вы выполняете поиск в столбце с именем ProductTitle, создайте столбец с именем ProductRev. Затем обновите значение этого поля "Расчетная спецификация столбца":

(обратное ([ProductTitle]))

Включите столбец "ProductRev" в свой поиск, и теперь вы сможете возвращать результаты, которые поддерживают подстановочный знак в начале слова. Удачи!

Ответ 5

В полном тексте есть таблица, в которой перечислены все слова, найденные движком. Он должен иметь порядки меньше строк, чем таблица с полным текстом. Вы можете выбрать из этой таблицы "где поле типа" % book% ", чтобы получить все слова, в которых есть" книга". Затем используйте этот список для написания полнотекстового запроса. Это громоздко, но это сработает, и это будет нормально в отделе скорости. ОДНАКО, в конечном итоге вы используете полнотекстовый код неправильно, когда делаете это. Возможно, было бы лучше просвещать источник этих запросов функций о том, что делает полный текст. Вы хотите, чтобы они поняли, что нужно делать, чтобы они могли получить большую ценность из полнотекстового текста. Например, используйте только дикие карты в конце слова, что означает думать о словах в упорядоченном списке.

Ответ 6

Почему бы не запрограммировать сборку на С#, чтобы вычислить все неоднократные префиксы. Например, если у вас есть текст "съесть красное мясо", вы можете хранить в поле "съесть его мясо" (обратите внимание, что нет необходимости добавлять "едят" и "снова" ), затем в этом поле используйте полнотекстовый поиск. Функция для этого может быть легко записана в Csharp

x) Я знаю, что это похоже... это рабочий стол x) Я знаю, что добавляю накладные расходы в insert/update.... только оправдано, если эти накладные расходы незначительны, кроме улучшения функции поиска x) Я знаю, что есть также накладные расходы по размеру сохраненных данных.

Но я довольно уверен, что будет довольно быстро