2013-04-01 6 views
1

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

Лучше использовать пример. Скажем, у меня есть эта простая таблица с двумя текстовыми столбцами (я оставляю остальные столбцы).

Id Text_1 Text_2 
1  a  a b 
2  c  a b 

Теперь, если я хочу, чтобы искать «„а“, а не„Ъ“», в моей текущей реализации я получаю запись 1 назад. Я понимаю, почему это так, потому что условие поиска соответствует столбцу «Text_1», а для записи 2 это не соответствует ни одному столбцу.

Однако для конечного пользователя это может быть неинтуитивным, поскольку они, вероятно, означают, что большую часть времени также исключает запись 1.

Так что я хочу сказать, что SQL Server должен выполнить сопоставление «по всем столбцам» (это означает, что если часть «NOT» находится в ЛЮБОМ столбце, запись не должна совпадать), это возможное?

EDIT: Это то, что мой запрос будет выглядеть для этого примера:

SELECT Id, TextHits.RANK Rank, Text_1, Text_2 FROM simple_table 
JOIN CONTAINSTABLE(simple_table, (Text_1, Text_2), '"a" and not "b"') TextHits 
ON TextHits.[KEY] = simple_table.Id 
ORDER BY Rank DESC 

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

Спасибо!

+2

@xurumunga. , , Можете ли вы привести пример текущего кода, который вы используете, что вы не думаете, что оно делает правильно? Кроме того, важна база данных как тега, потому что разные базы данных имеют разные преимущества для поиска текста. –

+0

Спасибо @ Gordon за предложения. Я добавил запрос и тег. – xurumanga

+0

есть миллион различных примеров, и это дубликат дубликата кажется: http://stackoverflow.com/questions/1796506/search-all-tables-all-columns-for-a-specific-value-sql- server – RandomUs1r

ответ

1

Логика будет оцениваться по каждой записи, поэтому, если вы хотите, чтобы исключение попало из одной записи в строке, чтобы вызвать исключение из строки, вы должны использовать NOT EXISTS и вывести запрос fullText в отдельное включение и исключение детали ...

SELECT Id, 
     TextHits.RANK Rank, 
     Text_1, 
     Text_2 
FROM simple_table 
JOIN CONTAINSTABLE(simple_table, (Text_1, Text_2), '"a"') TextHits 
     ON TextHits.[KEY] = simple_table.Id 
WHERE NOT EXISTS (SELECT 1 
        FROM CONTAINSTABLE(simple_table, (Text_1, Text_2), '"b"') exclHits 
        WHERE TextHits.[KEY] = exclHits.[KEY]) 
ORDER BY Rank DESC 
+0

Спасибо @ Love2Learn. Подобно RandomUs1r, также кажется, что выполнение этого пост-шага для исключения - это то, что мне нужно сделать. Я просто должен подумать об этом, потому что мне нужно поддерживать больше, чем «а», а не «b», и я не хотел слишком усложнять мой запрос. Я надеюсь, что это сработает. Я отправлю сообщение, когда у меня появится шанс попробовать. – xurumanga

+0

Этот подход сделал трюк. Мы закончили что-то немного другое, но почти то же самое; вместо того, чтобы делать WHERE NOT EXISTS, мы закончили с WHERE Id NOT IN (SELECT exclHits. [KEY] FROM CONTAINSTABLE (...)). Cheers all :) – xurumanga

+0

С точки зрения плана запроса вы также можете выполнить 'NOT EXISTS' и просто изменить' WHERE TextHits. [KEY] = exclHits. [KEY] 'to 'WHERE simple_table.Id = exclHits. [KEY] ', но с точки зрения плана запроса это должно быть одно и то же. Рад, что это сработало для вас. –

Смежные вопросы