Полнотекстовый поиск и доменные имена

Я наткнулся на проблему с полнотекстовым поиском в столбцах, которые могут содержать доменные имена на Microsoft SQL Server 2012.

Ячейка таблицы, содержащая example.com, добавляется к полному текстовому каталогу терминами example и com. Последнее делает невозможным поиск доменного имени, так как будет найдена любая запись, содержащая это tld.

Что нужно сделать, чтобы URL-адреса не взломались?

РЕДАКТИРОВАТЬ: пример запроса:

SELECT * FROM Test WHERE FREETEXT(test, 'example.com')

Таблица Test содержит только две строки, содержащие example.com и differenturl.com, обе возвращаются как результат. База данных Test была создана для этого примера.


person sk904861    schedule 16.07.2013    source источник
comment
Почему вы просто не используете varchar для сохранения доменов?   -  person Alker    schedule 16.07.2013
comment
Эти домены появляются в тексте, например Мне нравится example.com.   -  person sk904861    schedule 16.07.2013
comment
Вы уверены, что он сломан? Я подтвердил, что этот запрос дает результаты (как со списками стоп-слов, определенными в индексе, так и без них): SELECT * FROM YourTable WHERE Contains(*, 'example.com')   -  person Keith    schedule 16.07.2013
comment
Вы пробовали искать example.com с другими записями, такими как url.com? Моя проблема в том, что последнее также появляется при поиске example.com, так как запись url.com упоминается просто com в полнотекстовом каталоге.   -  person sk904861    schedule 16.07.2013
comment
Я не наблюдаю такого поведения. Если я ищу example.com, то получаю результаты только с example.com. То же самое для url.com.   -  person Keith    schedule 17.07.2013
comment
Можете ли вы опубликовать свой полнотекстовый запрос?   -  person Keith    schedule 17.07.2013
comment
Спасибо за ваши усилия. Я только что обновил свой вопрос.   -  person sk904861    schedule 17.07.2013


Ответы (2)


Используйте CONTAINS вместо FREETEXT.

SELECT * FROM Test WHERE CONTAINS(test, 'example.com')

FREETEXT будет рассматривать example.com как example OR com, что объясняет, почему ваш запрос FREETEXT для example.com совпадает с url.com. Он также будет соответствовать флективным формам (примеры, примеры ...) и синонимам, которые могут вызвать у вас другие проблемы.

Если вам все еще нужна гибкость FREETEXT для других поисковых запросов, вы можете использовать обе функции:

SELECT * FROM Test WHERE CONTAINS(test, 'example.com') and FREETEXT(test, 'some other text')

person Keith    schedule 18.07.2013
comment
К сожалению, CONTAINS не позволяет использовать несколько терминов в одном запросе, что в моем случае является важной частью полнотекстовой магии. - person sk904861; 18.07.2013
comment
Это так, но вы должны использовать логический синтаксис. SELECT * FROM Test WHERE CONTAINS(test, 'example.com AND (something OR other)') - person Keith; 18.07.2013
comment
К сожалению, я забыл упомянуть в своем вопросе, что CONTAINS по-прежнему оставляет другую проблему (невозможно найти C&A). Тем не менее, ваш ответ принимается. - person sk904861; 19.07.2013
comment
& - это логический оператор в CONTAINS. Вы можете обойти это, заключив термин в двойные кавычки: SELECT * FROM Test WHERE CONTAINS(test, '"C&A" & example.com') - person Keith; 19.07.2013
comment
Я также расширил свой ответ примером того, как вы все еще можете использовать FREETEXT для других ваших терминов в сочетании с CONTAINS для домена. - person Keith; 19.07.2013

Этот:

SELECT TOP 1000 
[Domain1]
FROM [TESTIT].[dbo].[DomainTest] where Domain1 like '%example%com';
person Alker    schedule 16.07.2013
comment
Хотелось бы сохранить полнотекстовый поиск. - person sk904861; 16.07.2013
comment
вроде не является оператором полнотекстового поиска. - person sino; 18.02.2021