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?
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
Vous devez vous connecter pour publier un commentaire.
Puisque vous obtenez des coups multiples sur plusieurs mots, vous pouvez utiliser l'ID sélectionnées est comme un filtre pour la sélection des articles:
Il devrait encore être raisonnablement rapide (par rapport à la requête initiale) et sans doublon.
(comme dans Rawheiser de réponse, il y a une hypothèse selon laquelle un champ ID existe réellement :))
OriginalL'auteur SWeko
Si vous faites ces types de recherche, vous devez utiliser une recherche plein texte. Vous avez besoin de lire dans le BOL sur la façon de définir ce que c'est compliqué. Toutefois, lorsque vous avez un caractère générique comme le premier caractère, puis SQL server ne peut pas utiliser les index qui est pourquoi c'est lent.
BOL est des Livres en ligne qui est à l'aide de SQL Server. Upas était une faute de frappe pour comme
BOL pour nous, les moyens Boots opticiens
OriginalL'auteur HLGEM
Si il y a un Article de nouvelles clés, vous pouvez utiliser une requête qui joint à lui-même comme:
Comme c'est toujours le cas avec les conseils - "votre kilométrage peut varier".
OriginalL'auteur Rawheiser
Vous pouvez également essayer la Recherche de Texte Intégral. Quelque chose comme
Mais, comme HLGEM dit, il sera important de lire sur le paramétrage de la FTS. Juste la création d'un index pour ces deux colonnes peuvent être assez depuis que vous êtes à la recherche pour des mots isolés, mais une fois que vous ajouter des phrases que vous voulez commencer à modifier les mots vides et les disjoncteurs et le bruit des mots.
OriginalL'auteur randcd
Je voudrais donc quelque chose comme cela
J'avais un programme casse processus d'indexation qui irait à nuits:
SEARCH_TERM
tout nouveau mot qu'il trouveSEARCH_INDEX
un tuple qui dit qu'un article a un terme de recherche donnéNEWS_ARTICLE
comme déjà indexées.La un exemple de requête peut être comme ça, et serait d'éclairage rapide puisque vous ne serez pas à l'aide de
LIKE
:Plus tard, vous pouvez créer des synonymes pour les termes de recherche et de créer une vue qui renvoie termes avec leurs synonymes, si vous voulez faire plus sémantique des recherches dans le futur.
OriginalL'auteur Tulains Córdova