Полнотекстовый поиск SQL Server возвращает неожиданный результат - PullRequest
1 голос
/ 29 марта 2019

У меня есть пара миллионов записей в таблице базы данных Microsoft SQL Server. Поиск с [Column] LIKE '%test%' слишком медленный. Поэтому я использую полнотекстовый поиск.

Мой запрос выглядит следующим образом после множества попыток с CONTAINS и FREETEXT ...

SELECT [SearchText] FROM [Service].[CatalogArticleCache] AS t
INNER JOIN CONTAINSTABLE([Service].[CatalogArticleCache], [SearchText], '"*426*"') AS s1 ON t.ArticleId = s1.[KEY]
INNER JOIN CONTAINSTABLE([Service].[CatalogArticleCache], [SearchText], '"*211*"') AS s2 ON t.ArticleId = s2.[KEY]
INNER JOIN CONTAINSTABLE([Service].[CatalogArticleCache], [SearchText], '"*Geschweisst*"') AS s3 ON t.ArticleId = s3.[KEY]
INNER JOIN CONTAINSTABLE([Service].[CatalogArticleCache], [SearchText], '"*rohr*"') AS s4 ON t.ArticleId = s4.[KEY]
--INNER JOIN CONTAINSTABLE([Service].[CatalogArticleCache], [SearchText], '"*bogen*"') AS s5 ON t.ArticleId = s5.[KEY]
ORDER BY [SearchText]

Этот запрос возвращает пару записей, таких как ...

426 211357 .Geschweisste Rohrbogen 2d90
426 211682 .Geschweisste Leitungsrohre ungegl.
426 211990 .Geschweisste Rohrbogen D + 100
...

Как только я включу вторую последнюю строку моего SQL-запроса, я ожидаю, что результат в середине исчезнет. К сожалению, запрос не возвращает ни одной строки.

Почему это и как это исправить?

1 Ответ

0 голосов
/ 04 апреля 2019

Проблема в том, что в MS SQL Server ведущие символы подстановки не поддерживаются, вы можете искать только префиксы с символами подстановки, например "term*".Согласно моему пониманию, все первые 4 JOINs, даже если с ведущими подстановочными знаками в поисковых терминах, разрешаются, потому что основной текст содержит слова, начинающиеся с ваших 426, Geschweisst и rohr терминов.Начальная точка в .Geschweisste игнорируется, потому что это стоп-слово.

Но в вашем тексте нет слова, которое начинается с bogen, поскольку bogen в Rohrbogenнаходится в конце слова.Поскольку вы используете INNER JOIN, вы вообще ничего не получите.

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

Также этот запрос может быть полезен при изучении того, как на самом деле движок FTS.анализирует условия поиска:

select * from sys.dm_fts_parser('"search terms"', 1033, null, 0)

Надеюсь, это поможет!

...