Полнотекстовый каталог / поиск по индексу% book% - PullRequest
16 голосов
/ 17 ноября 2008

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

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

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

Ответы [ 6 ]

15 голосов
/ 17 ноября 2008

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

CONTAINS(*, '"book*"')
7 голосов
/ 17 ноября 2008

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

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

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

3 голосов
/ 17 ноября 2008

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

1 голос
/ 22 мая 2012

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

1 голос
/ 06 мая 2011

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

Если, например, вы ищете в столбце с именем «ProductTitle», то создайте столбец с именем ProductsRev. Затем обновите значение «Спецификация вычисляемого столбца» в этом поле следующим образом:

(обратный ([ProductTitle]))

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

0 голосов
/ 07 января 2014

почему бы не запрограммировать сборку в C # для вычисления всех неповторяющихся суффиксов. Например, если у вас есть текст «ешьте красное мясо», вы можете хранить его в поле «ешьте с красным мясом» (обратите внимание, что добавлять и ешить снова и снова не обязательно) ind тогда в этом поле использовать полнотекстовый поиск. Функция для этого может быть легко написана на Csharp

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

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

...