use Search::Fulltext; my @docs = ( 'I like beer the best', 'Wine makes people saticefied', # does not include beer 'Beer makes people happy', ); my $fts = Search::Fulltext->new({ docs => \@docs, }); my $results = $fts->search('beer'); is_deeply($results, [0, 2]); # 1st & 3rd doc include 'beer' my $results = $fts->search('beer AND happy'); is_deeply($results, [2]); # 3rd doc includes both 'beer' & 'happy'
Search::Fulltext has pluggable tokenizer feature, which possibly provides fulltext search for any language. Currently, English and Japanese fulltext search are officially supported, although any other languages which have spaces for separating words could be also used. See CUSTOM TOKENIZERS section to learn how to search non-English languages.
SQLite's FTS4 is used as an indexer. Various queries supported by FTS4 ("AND", "OR", "NEAR", ...) are fully provided. See ``QUERIES'' section for details.
Japanese tokenizer "perl 'Search::Fulltext::Tokenizer::MeCab::tokenizer'" is also available after you install Search::Fulltext::Tokenizer::MeCab module.
See CUSTOM TOKENIZERS section for developing other tokenizers.
my $results = $fts->search('beer');
Other queries below and combination of them can be also used.
my $results = $fts->search('beer AND happy'); my $results = $fts->search('saticefied OR happy'); my $results = $fts->search('people NOT beer'); my $results = $fts->search('make*'); my $results = $fts->search('"makes people"'); my $results = $fts->search('beer NEAR happy'); my $results = $fts->search('beer NEAR/1 happy');
See <http://www.sqlite.org/fts3.html#section_3> for an explanation of each type of query.
NOTE: Some custom tokenizers might not support full of these queries above. Check the document of each tokenizer before using complex queries.
See ``Perl_tokenizers'' in DBD::SQLite and Search::Fulltext::Tokenizer::MeCab module to learn how to develop custom tokenizers.