SQLite - comment retourner les lignes contenant un champ texte qui contient une ou plusieurs chaînes?
J'ai besoin d'interroger une table dans une base de données SQLite pour retourner toutes les lignes dans une table qui correspondent à un ensemble de mots.
Pour être plus précis: j'ai une base de données avec ~80 000 documents. L'un des champs est un champ de texte avec autour de 100 à 200 mots par enregistrement. Ce que je veux être en mesure de faire est de prendre une liste de 200 seul mot mots-clés {"apple", "orange", "poire", ... } et récupérer un ensemble de tous les enregistrements dans la table qui contiennent au moins l'un des mots clés dans la colonne description.
Le immédiatement évident façon de le faire est avec quelque chose comme ceci:
SELECT stuff FROM table
WHERE (description LIKE '% apple %') or (description LIKE '% orange %') or ...
Si j'ai 200 termes, je me retrouve avec un gros et méchant à la recherche de l'instruction SQL qui me semble maladroit, est un bel exemple de mauvaise pratique, et il n'est pas surprenant prend beaucoup de temps - plus d'une seconde par 1000 enregistrements.
Cette réponse De meilleures performances pour SQLite Instruction Select semblait proche de ce dont j'ai besoin, et par conséquent, j'ai créé un indice, mais selon http://www.sqlite.org/optoverview.html sqlite ne pas utiliser toute la optimisations si l'opérateur LIKE est utilisé avec un début % de génériques.
N'étant pas un SQL expert, je suis en supposant que je suis en train de faire ce que les muets. Je me demandais si quelqu'un avec plus d'expérience pourrait suggérer un plus raisonnable et peut-être la façon la plus efficace de le faire?
Sinon, est-il une meilleure approche que je pourrais utiliser pour le problème?
OriginalL'auteur Sam | 2011-01-06
Vous devez vous connecter pour publier un commentaire.
À l'aide de la SQLite de recherche de texte intégral serait plus rapide qu'un LIKE '%...%' de la requête. Je ne pense pas qu'une base de données qui peut utiliser un index pour une requête commençant par %, comme si la base de données ne sais pas ce que la requête commence par puis il ne peut pas utiliser l'index pour le regarder.
Une approche alternative est de mettre les mots clés dans une table distincte au lieu de cela, et de faire une table intermédiaire qui dispose de l'information sur la ligne dans votre tableau principal a les mots clés. Si vous avez indexé toutes les colonnes de cette façon, il pourrait être interrogé très rapidement.
OriginalL'auteur mikel
Semble que vous pourriez voulez avoir un coup d'oeil à Recherche En Texte Intégral. Il a contribué à SQLite par quelqu'un de chez google. La description:
OriginalL'auteur Nick Fortescue
C'est le même problème que la recherche de texte intégral, droit? Dans ce cas, vous avez besoin de l'aide de la DB pour construire des indices dans ces champs si vous voulez le faire efficacement. Une recherche rapide pour SQLite de recherche de texte intégral les rendements cette page.
La solution de vous identifier correctement aussi maladroit va probablement faire jusqu'à 200 expression régulière correspond par document, dans le pire des cas (c'est à dire lorsqu'un document ne correspond pas), où chaque match est de parcourir l'ensemble du champ. À l'aide de l'indice approche signifie que votre vitesse de recherche est indépendante de la taille de chaque document.
OriginalL'auteur sjr