2009-07-17 11 views
1

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

0

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 
+0

Désolé, j'ai oublié de mentionner que je suis sur l'iphone, je peux ajouter ces regexes à l'iphone? –

+0

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

1

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.

0

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.

Questions connexes