Если у меня есть запись в базе данных о «Mens White Crew T-Shirt», то, что SQL-запрос сделать мне нужно бежать, чтобы вернуть запись, если пользователь ищет «Mens T-Shirt» или «White T-Shirt «?
select *
from Products
where Description like '%' + replace(@SearchTerm, ' ', '%') + '%'
-- where 'Mens White Crew T-Shirt' like '%Mens%T-Shirt%' -- Returns true
-- where 'Mens White Crew T-Shirt' like '%White%T-Shirt%' -- Returns true
Вы можете получить как творческие, как вы хотите с заменами (другие символы, такие как дефис, что, к примеру), но это несколько рубить. Это точно не работает для «Men's» или «Shirt White»
Действительно, этот тип запроса - это то, что Full-Text Search - вот и все, а вторая рекомендация a_horse_with_no_name.
Если это невозможно, вам, вероятно, придется идти по пути дезинфекции и разбиения поискового запроса и найденных столбцов и динамического создания запроса. Вы могли бы в конечном итоге с чем-то, что в конечном итоге выглядит следующим образом (с использованием параметров, надеюсь) приходит из вашего приложения:
exec sp_executesql N'
select *
from Products
where Description like ''%'' + @SearchTerm1 + ''%''
and Description like ''%'' + @SearchTerm2 + ''%''
and Description like ''%'' + @SearchTerm3 + ''%''
-- etc.',
N'@SearchTerm1 varchar(100), @SearchTerm2 varchar(100), @SearchTerm3 varchar(100)',
'Mens', -- What about "men" or "man", and this would still get "womens"
'T', -- Any "T", yikes...possibly have to sanitize the column and search term to "tshirt"
'Shirt'
Но это еще не будет охватывать все, что FTS может, и, возможно, не так быстро.
Что вы пытались? – Don
Какой db вы используете? –
Если ваша СУБД поддерживает массивы и регулярные выражения, вы можете разделить каждый заголовок и поисковый запрос на все слова, а затем сопоставить массивы. Но полный текстовый поиск - лучший способ. Реляционные СУБД не предназначены для такого рода запросов. –