KinoSearch::Docs::Tutorial::BeyondSimple man page on Fedora

Man page or keyword search:  
man Server   31170 pages
apropos Keyword Search (all sections)
Output format
Fedora logo
[printable version]

KinoSearch::Docs::TutoUser:ContribuKinoSearch::Docs::Tutorial::BeyondSimple(3)

NAME
       KinoSearch::Docs::Tutorial::BeyondSimple - A more flexible app
       structure.

DESCRIPTION
   Goal
       In this tutorial chapter, we'll refactor the apps we built in
       KinoSearch::Docs::Tutorial::Simple so that they look exactly the same
       from the end user's point of view, but offer the developer greater
       possibilites for expansion.

       To achieve this, we'll ditch KSx::Simple and replace it with the
       classes that it uses internally:

       ·   KinoSearch::Plan::Schema - Plan out your index.

       ·   KinoSearch::Plan::FullTextType - Field type for full text search.

       ·   KinoSearch::Analysis::PolyAnalyzer - A one-size-fits-all
	   parser/tokenizer.

       ·   KinoSearch::Index::Indexer - Manipulate index content.

       ·   KinoSearch::Search::IndexSearcher - Search an index.

       ·   KinoSearch::Search::Hits - Iterate over hits returned by a
	   Searcher.

   Adaptations to indexer.pl
       After we load our modules...

	   use KinoSearch::Plan::Schema;
	   use KinoSearch::Plan::FullTextType;
	   use KinoSearch::Analysis::PolyAnalyzer;
	   use KinoSearch::Index::Indexer;

       ... the first item we're going need is a Schema.

       The primary job of a Schema is to specify what fields are available and
       how they're defined.  We'll start off with three fields: title, content
       and url.

	   # Create Schema.
	   my $schema = KinoSearch::Plan::Schema->new;
	   my $polyanalyzer = KinoSearch::Analysis::PolyAnalyzer->new(
	       language => 'en',
	   );
	   my $type = KinoSearch::Plan::FullTextType->new(
	       analyzer => $polyanalyzer,
	   );
	   $schema->spec_field( name => 'title',   type => $type );
	   $schema->spec_field( name => 'content', type => $type );
	   $schema->spec_field( name => 'url',	   type => $type );

       All of the fields are spec'd out using the "FullTextType" FieldType,
       indicating that they will be searchable as "full text" -- which means
       that they can be searched for individual words.	The "analyzer", which
       is unique to FullTextType fields, is what breaks up the text into
       searchable tokens.

       Next, we'll swap our KSx::Simple object out for a
       KinoSearch::Index::Indexer.  The substitution will be straightforward
       because Simple has merely been serving as a thin wrapper around an
       inner Indexer, and we'll just be peeling away the wrapper.

       First, replace the constructor:

	   # Create Indexer.
	   my $indexer = KinoSearch::Index::Indexer->new(
	       index	=> $path_to_index,
	       schema	=> $schema,
	       create	=> 1,
	       truncate => 1,
	   );

       Next, have the $indexer object "add_doc" where we were having the
       $simple object "add_doc" before:

	   foreach my $filename (@filenames) {
	       my $doc = slurp_and_parse_file($filename);
	       $indexer->add_doc($doc);
	   }

       There's only one extra step required: at the end of the app, you must
       call commit() explicitly to close the indexing session and commit your
       changes.	 (KSx::Simple hides this detail, calling commit() implicitly
       when it needs to).

	   $indexer->commit;

   Adaptations to search.cgi
       In our search app as in our indexing app, KSx::Simple has served as a
       thin wrapper -- this time around KinoSearch::Search::IndexSearcher and
       KinoSearch::Search::Hits.  Swapping out Simple for these two classes is
       also straightforward:

	   use KinoSearch::Search::IndexSearcher;

	   my $searcher = KinoSearch::Search::IndexSearcher->new(
	       index => $path_to_index,
	   );
	   my $hits = $searcher->hits(	  # returns a Hits object, not a hit count
	       query	  => $q,
	       offset	  => $offset,
	       num_wanted => $hits_per_page,
	   );
	   my $hit_count = $hits->total_hits;  # get the hit count here

	   ...

	   while ( my $hit = $hits->next ) {
	       ...
	   }

   Hooray!
       Congratulations!	 Your apps do the same thing as before... but now
       they'll be easier to customize.

       In our next chapter, KinoSearch::Docs::Tutorial::FieldType, we'll
       explore how to assign different behaviors to different fields.

COPYRIGHT AND LICENSE
       Copyright 2005-2010 Marvin Humphrey

       This program is free software; you can redistribute it and/or modify it
       under the same terms as Perl itself.

perl v5.14.1			  2KinoSearch::Docs::Tutorial::BeyondSimple(3)
[top]

List of man pages available for Fedora

Copyright (c) for man pages and the logo by the respective OS vendor.

For those who want to learn more, the polarhome community provides shell access and support.

[legal] [privacy] [GNU] [policy] [cookies] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.
Based on Fawad Halim's script.
....................................................................
Vote for polarhome
Free Shell Accounts :: the biggest list on the net