J'ai une table qui a une colonne de titre. Je veux rechercher des mots entiers comme foo. donc "hi foo bye" o "foo", mais pas "foobar" ou "hellofoo". Y at-il un moyen sans changer la structure de la table pour le faire? J'utilise actuellement 3 requêtes similaires, mais elle est trop lente, j'ai "select * des articles où titre comme '% foo' ou titre comme 'foo%' ou title = 'foo' ou titre comme '% foo%';
Il doit y avoir une meilleure façon de le fairecomment rechercher des mots entiers efficacement dans un sqlite db
Répondre
réponse spontanée:.
utiliser le regexp opérateur au lieu du comme opérateur
EDIT Je viens de réaliser que regexp n'est pas toujours inclus avec SQLite. Vous devrez peut-être compiler vous-même ... autrement dit, ce n'est pas là par défaut ..
EDIT2
est ici un exemple de Perl travail ..
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use DBI;
# connect to the DB
my $dbh = DBI->connect("dbi:SQLite:dbname=dbfile","","");
# create ugly, pureperl function 'regexp'
# stolen from http://d.hatena.ne.jp/tokuhirom/20090416/1239849298
$dbh->func( "regexp"
, 2
, sub { my ($pattern, $target) = @_;
utf8::decode($pattern);
utf8::decode($target);
$target =~ m{$pattern} ? 1 : 0;
}
, "create_function");
# drop table, if it exists
$dbh->do('drop table if exists foobar');
$dbh->do('create table foobar (foo varchar not null)');
my $sth=$dbh->prepare('insert into foobar (foo) values (?)');
while (<DATA>) { chop;$sth->execute($_); }
#query using regexp
my $a= $dbh->selectall_arrayref('select foo '
.'from foobar '
.'where foo regexp "^foo$|^foo\s+.*|.*\W+foo\W+.*|.*\W+foo$"'
);
print join("\n", map {$_->[0];} @{$a})
__DATA__
foo
foo
barfoo
foobarfolo
sdasdssds bar dasdsdsad
dasdsdasdsadsads foo! dasdasdasdsa
Vous pourriez être intéressé par une recherche indexeur comme Lucene, fureter, ou sphinx. Ceux-ci fonctionneraient en tant que processus séparés qui indexeraient vos données pour une recherche rapide où le stemming, etc. peut être configuré. Alternativement, en fonction de vos données, vous pouvez simplement retourner tous les résultats contenant "foo" dans n'importe quel contexte, puis les filtrer avec des expressions régulières ou autres en dehors de la base de données. Cela pourrait être une amélioration en fonction des caractéristiques de vos données.
Il existe différentes bibliothèques regexp que vous pouvez inclure dans votre application iPhone en les associant à votre build. Pour plus d'informations, voir this Stackoverflow question.
- 1. Comment rechercher des mots complets dans vim?
- 2. mots entiers Regex.Match
- 3. C# expressions régulières - mots entiers correspondants?
- 4. sed recherche de mots entiers et remplacement
- 5. Rechercher des mots, Remplacer Liens
- 6. Comment générer des mots longs de 2 caractères efficacement?
- 7. Impossible de rechercher efficacement dans l'écran
- 8. affichant des entiers dans android en utilisant sqlite
- 9. Comment rechercher un enregistrement avec un caractère spécial (') dans DB
- 10. Comment extraire efficacement des mots d'une phrase en C?
- 11. Comment rechercher un ensemble de mots clés à partir d'un champ de mots clés dans Solr?
- 12. Rechercher dans toutes les tables Oracle DB
- 13. mysql SELECT COMME doit correspondre des mots entiers seulement à la variable
- 14. Comment rechercher efficacement un tableau pour remplir des champs de formulaire?
- 15. Comment puis-je rechercher efficacement des ensembles contigus de dates dans mon ensemble de données?
- 16. Comment vider efficacement un fichier Perl DBM?
- 17. Comment implémenter efficacement des sessions dans GAE?
- 18. Implémentation MIDP Java de SQLite DB
- 19. Comment débloquer un sqlite3 db?
- 20. sqlite DB ne pas mettre à jour?
- 21. Comment obtenir vidage binaire de la mémoire SQLite db
- 22. Insertion d'enregistrements dans Sqlite DB à l'aide d'ADO.NET Entity Framework?
- 23. Comment convertir des données efficacement dans DataTable dans ADO.Net
- 24. Comment écrire des instructions préparées pour SQLite dans l'iPhone
- 25. Echapper _ efficacement dans un environnement tabulaire, LaTeX
- 26. Mots réservés dans NHibernate
- 27. Est-ce que quelqu'un connaît un webservice pour rechercher des définitions de mots qui pourraient renvoyer des résultats dans JSON?
- 28. Rechercher des permutations de chaînes dans le jeu de chaînes
- 29. Meilleur moyen de rechercher base de données sqlite
- 30. Comment authentifier efficacement l'utilisateur appelant un webservice?
Désolé, j'ai oublié de mentionner que je suis sur l'iphone, je peux ajouter ces regexes à l'iphone? –
Je suppose que vous pourriez. Mais mais ** n'utilisant pas Perl **. Il doit y avoir un moyen d'ajouter la fonction "regexp" en utilisant objectve c. – lexu