как эффективно искать целые слова в базе данных sqlite - PullRequest
1 голос
/ 17 июля 2009

У меня есть таблица с заголовком столбца. Я хочу искать целые слова, такие как Foo. так что сопоставьте «привет, пока», «foo», но не «foobar» или «hellofoo». Есть ли способ без изменения структуры таблицы, чтобы сделать это? В настоящее время я использую 3 похожих запроса, но это слишком медленно, у меня есть «select * из статей, где title вроде«% foo »или title вроде« foo% »или title =« foo »или title вроде«% foo% »;
Должен ли быть лучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 17 июля 2009

Вас может заинтересовать поисковый индексатор, такой как люцен, хорьок или сфинкс. Они будут запускаться как отдельные процессы, которые будут индексировать ваши данные для быстрого поиска, где можно сконфигурировать ствол и т. Д.

В качестве альтернативы, в зависимости от ваших данных, вы можете просто вернуть все результаты, содержащие «foo» в любом контексте, а затем отфильтровать их с помощью регулярных выражений или тому подобное вне базы данных. Это может быть улучшение в зависимости от характеристик ваших данных.

0 голосов
/ 04 ноября 2009

Существуют различные библиотеки регулярных выражений, которые вы можете включить в свое приложение для iPhone, связавшись с ними в вашей сборке.

См. этот вопрос Stackoverflow для получения дополнительной информации.

0 голосов
/ 17 июля 2009

спонтанный ответ:

используйте оператор регулярного выражения вместо , как оператор .

РЕДАКТИРОВАТЬ Я только что понял, что регулярное выражение не всегда включено в SQLite. Возможно, вам придется скомпилировать свой собственный ... другими словами, он не существует по умолчанию ..

EDIT2

вот рабочий пример Perl ..

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...