T-SQL - Comment puis-je faire une requête SELECT avec plusieurs COMME des clauses plus rapide?

J'ai une fonction de recherche pour les articles de presse qui ressemble à ceci (contient plus de 5 articles de recherche):

SELECT TOP 5 *
FROM NewsArticles
WHERE (headline LIKE '% sustainable %'OR
headline LIKE '% sustainability %' OR
headline LIKE '% conservation %' OR
headline LIKE '% environmental % OR
headline LIKE '% environmentally %') 
OR
(body LIKE '% sustainable %'OR
body LIKE '% sustainability %' OR
body LIKE '% conservation %' OR
body LIKE '% environmental % OR
body LIKE '% environmentally %')
ORDER BY publishDate DESC 

Cette requête est conçu pour tirer le top 5 des nouvelles histoires relatives à la durabilité et s'assoit sur mon principal viabilité de la page d'accueil. Cependant, il faut du temps pour exécuter et la page est longue à charger. Donc, je suis à la recherche des moyens pour accélérer le processus. Avoir autant COMME des clauses semble lourd donc j'ai essayé quelque chose avec une JOINTURE comme ceci:

CREATE TABLE #SearchItem (Search varchar(255))

INSERT INTO #SearchItem VALUES
('sustainable'),
('sustainability'),
('conservation'),
('environmental'),
('environmentally')

SELECT TOP 5 *
FROM NewsArticles as n
JOIN #SearchItem as s
ON n.headline COLLATE DATABASE_DEFAULT LIKE '% ' + s.Search + ' %' OR 
n.body COLLATE DATABASE_DEFAULT LIKE '% ' + s.Search + ' %'
ORDER BY n.publishDate DESC

Cela semble fonctionner très bien pour la performance, mais semble parfois rapporter des articles dupliqués où l'un des mots de la recherche s'affiche dans le corps et le titre (ce qui est souvent le cas). J'ai essayé d'utiliser le mot à l'aide de 'SELECT DISTINCT TOP 5*", mais cela me donne une erreur en disant: "Le type de données ntext ne peut pas être sélectionné en tant que DISTINCTE parce qu'elle n'est pas comparable'. Est-il loin de l'arrêt de ce de rapporter des doublons sans faire 2 recherches distinctes et à l'aide de l'UNION?

Pourquoi utiliser *? Avez-vous besoin de la colonne de ntext type?
Le double % dans votre like états sont l'un des principaux coupables... avez-vous besoin de cette information mise à jour en (quasi) temps réel? Si non, vous pourriez avoir une table avec articleID (vos articles ont un ID d'une certaine sorte, je suppose?) et les indicateurs pour les is_sustainable, is_conservation, etc. Ensuite, vous pourriez avoir un lot de travail qui permettrait d'insérer de nouvelles lignes dans cette table, la saisie des indicateurs corrects via like consolidés. Ensuite, vient se joindre à l'encontre de cette table de recherche et utiliser les indicateurs.
Je pense que le problème avec les doubles survient lorsqu'il y a un match sur plusieurs mots, pas un match ou d'en-tête et le corps
L'UNion est presque toujours plus rapide qu'à l'aide de OU. Ou est aperformance tueur au-delà de la performance tueur d'avoir un caractère générique comme la première charcter. Pourquoi ne veux-tu pas utiliser de l'UNION?
De l'argent - il ne faut en temps réel malheureusement. Toutefois les articles ne avoir un ID.

OriginalL'auteur sr28 | 2013-08-15