Added: lucy/site/trunk/content/docs/perl/Lucy/Docs/FileLocking.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Docs/FileLocking.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Docs/FileLocking.mdtext (added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Docs/FileLocking.mdtext Mon Apr  4 
09:22:30 2016
@@ -0,0 +1,93 @@
+Title: Lucy::Docs::FileLocking – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Docs::FileLocking - Manage indexes on shared volumes.</p>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>Normally,
+index locking is an invisible process.
+Exclusive write access is controlled via lockfiles within the index directory 
and problems only arise if multiple processes attempt to acquire the write lock 
simultaneously; search-time processes do not ordinarily require locking at 
all.</p>
+
+<p>On shared volumes,
+however,
+the default locking mechanism fails,
+and manual intervention becomes necessary.</p>
+
+<p>Both read and write applications accessing an index on a shared volume need 
to identify themselves with a unique <code>host</code> id,
+e.g.
+hostname or ip address.
+Knowing the host id makes it possible to tell which lockfiles belong to other 
machines and therefore must not be removed when the lockfile&#8217;s pid number 
appears not to correspond to an active process.</p>
+
+<p>At index-time,
+the danger is that multiple indexing processes from different machines which 
fail to specify a unique <code>host</code> id can delete each others&#8217; 
lockfiles and then attempt to modify the index at the same time,
+causing index corruption.
+The search-time problem is more complex.</p>
+
+<p>Once an index file is no longer listed in the most recent snapshot,
+Indexer attempts to delete it as part of a post-<a href="lucy:Indexer.Commit" 
class="podlinkurl"
+>lucy:Indexer.Commit</a> cleanup routine.
+It is possible that at the moment an Indexer is deleting files which it 
believes no longer needed,
+a Searcher referencing an earlier snapshot is in fact using them.
+The more often that an index is either updated or searched,
+the more likely it is that this conflict will arise from time to time.</p>
+
+<p>Ordinarily,
+the deletion attempts are not a problem.
+On a typical unix volume,
+the files will be deleted in name only: any process which holds an open 
filehandle against a given file will continue to have access,
+and the file won&#8217;t actually get vaporized until the last filehandle is 
cleared.
+Thanks to &#8220;delete on last close semantics&#8221;,
+an Indexer can&#8217;t truly delete the file out from underneath an active 
Searcher.
+On Windows,
+where file deletion fails whenever any process holds an open handle,
+the situation is different but still workable: Indexer just keeps retrying 
after each commit until deletion finally succeeds.</p>
+
+<p>On NFS,
+however,
+the system breaks,
+because NFS allows files to be deleted out from underneath active processes.
+Should this happen,
+the unlucky read process will crash with a &#8220;Stale NFS filehandle&#8221; 
exception.</p>
+
+<p>Under normal circumstances,
+it is neither necessary nor desirable for IndexReaders to secure read locks 
against an index,
+but for NFS we have to make an exception.
+LockFactory&#8217;s <a href="lucy:LockFactory.Make_Shared_Lock" 
class="podlinkurl"
+>lucy:LockFactory.Make_Shared_Lock</a> method exists for this reason; 
supplying an IndexManager instance to IndexReader&#8217;s constructor activates 
an internal locking mechanism using <a href="lucy:LockFactory.Make_Shared_Lock" 
class="podlinkurl"
+>lucy:LockFactory.Make_Shared_Lock</a> which prevents concurrent indexing 
processes from deleting files that are needed by active readers.</p>
+
+<pre>use Sys::Hostname qw( hostname );
+my $hostname = hostname() or die &#34;Can&#39;t get unique hostname&#34;;
+my $manager = Lucy::Index::IndexManager-&#62;new( host =&#62; $hostname );
+
+# Index time:
+my $indexer = Lucy::Index::Indexer-&#62;new(
+    index   =&#62; &#39;/path/to/index&#39;,
+    manager =&#62; $manager,
+);
+
+# Search time:
+my $reader = Lucy::Index::IndexReader-&#62;open(
+    index   =&#62; &#39;/path/to/index&#39;,
+    manager =&#62; $manager,
+);
+my $searcher = Lucy::Search::IndexSearcher-&#62;new( index =&#62; $reader 
);</pre>
+
+<p>Since shared locks are implemented using lockfiles located in the index 
directory (as are exclusive locks),
+reader applications must have write access for read locking to work.
+Stale lock files from crashed processes are ordinarily cleared away the next 
time the same machine &#8211; as identified by the <code>host</code> parameter 
&#8211; opens another IndexReader.
+(The classic technique of timing out lock files is not feasible because search 
processes may lie dormant indefinitely.) However,
+please be aware that if the last thing a given machine does is crash,
+lock files belonging to it may persist,
+preventing deletion of obsolete index data.</p>
+
+</div>

Added: lucy/site/trunk/content/docs/perl/Lucy/Docs/IRTheory.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Docs/IRTheory.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Docs/IRTheory.mdtext (added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Docs/IRTheory.mdtext Mon Apr  4 
09:22:30 2016
@@ -0,0 +1,69 @@
+Title: Lucy::Docs::IRTheory – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Docs::IRTheory - Crash course in information retrieval</p>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>Just enough Information Retrieval theory to find your way around Apache 
Lucy.</p>
+
+<h3><a class='u'
+name="Terminology"
+>Terminology</a></h3>
+
+<p>Lucy uses some terminology from the field of information retrieval which 
may be unfamiliar to many users.
+&#8220;Document&#8221; and &#8220;term&#8221; mean pretty much what 
you&#8217;d expect them to,
+but others such as &#8220;posting&#8221; and &#8220;inverted index&#8221; need 
a formal introduction:</p>
+
+<ul>
+<li><i>document</i> - An atomic unit of retrieval.</li>
+
+<li><i>term</i> - An attribute which describes a document.</li>
+
+<li><i>posting</i> - One term indexing one document.</li>
+
+<li><i>term list</i> - The complete list of terms which describe a 
document.</li>
+
+<li><i>posting list</i> - The complete list of documents which a term 
indexes.</li>
+
+<li><i>inverted index</i> - A data structure which maps from terms to 
documents.</li>
+</ul>
+
+<p>Since Lucy is a practical implementation of IR theory,
+it loads these abstract,
+distilled definitions down with useful traits.
+For instance,
+a &#8220;posting&#8221; in its most rarefied form is simply a term-document 
pairing; in Lucy,
+the class MatchPosting fills this role.
+However,
+by associating additional information with a posting like the number of times 
the term occurs in the document,
+we can turn it into a ScorePosting,
+making it possible to rank documents by relevance rather than just list 
documents which happen to match in no particular order.</p>
+
+<h3><a class='u'
+name="TF/IDF_ranking_algorithm"
+>TF/IDF ranking algorithm</a></h3>
+
+<p>Lucy uses a variant of the well-established &#8220;Term Frequency / Inverse 
Document Frequency&#8221; weighting scheme.
+A thorough treatment of TF/IDF is too ambitious for our present purposes,
+but in a nutshell,
+it means that&#8230;</p>
+
+<ul>
+<li>in a search for <code>skate park</code>,
+documents which score well for the comparatively rare term <code>skate</code> 
will rank higher than documents which score well for the more common term 
<code>park</code>.</li>
+
+<li>a 10-word text which has one occurrence each of both <code>skate</code> 
and <code>park</code> will rank higher than a 1000-word text which also 
contains one occurrence of each.</li>
+</ul>
+
+<p>A web search for &#8220;tf idf&#8221; will turn up many excellent 
explanations of the algorithm.</p>
+
+</div>

Added: lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial.mdtext (added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial.mdtext Mon Apr  4 
09:22:30 2016
@@ -0,0 +1,77 @@
+Title: Lucy::Docs::Tutorial – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Docs::Tutorial - Step-by-step introduction to Apache Lucy.</p>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>Explore Apache Lucy&#8217;s basic functionality by starting with a 
minimalist CGI search app based on Lucy::Simple and transforming it,
+step by step,
+into an &#8220;advanced search&#8221; interface utilizing more flexible core 
modules like <a href="../../Lucy/Index/Indexer.html" class="podlinkpod"
+>Indexer</a> and <a href="../../Lucy/Search/IndexSearcher.html" 
class="podlinkpod"
+>IndexSearcher</a>.</p>
+
+<h3><a class='u'
+name="Chapters"
+>Chapters</a></h3>
+
+<ul>
+<li><a href="../../Lucy/Docs/Tutorial/SimpleTutorial.html" class="podlinkpod"
+>SimpleTutorial</a> - Build a bare-bones search app using Lucy::Simple.</li>
+
+<li><a href="../../Lucy/Docs/Tutorial/BeyondSimpleTutorial.html" 
class="podlinkpod"
+>BeyondSimpleTutorial</a> - Rebuild the app using core classes like <a 
href="../../Lucy/Index/Indexer.html" class="podlinkpod"
+>Indexer</a> and <a href="../../Lucy/Search/IndexSearcher.html" 
class="podlinkpod"
+>IndexSearcher</a> in place of Lucy::Simple.</li>
+
+<li><a href="../../Lucy/Docs/Tutorial/FieldTypeTutorial.html" 
class="podlinkpod"
+>FieldTypeTutorial</a> - Experiment with different field characteristics using 
subclasses of <a href="../../Lucy/Plan/FieldType.html" class="podlinkpod"
+>FieldType</a>.</li>
+
+<li><a href="../../Lucy/Docs/Tutorial/AnalysisTutorial.html" class="podlinkpod"
+>AnalysisTutorial</a> - Examine how the choice of <a 
href="../../Lucy/Analysis/Analyzer.html" class="podlinkpod"
+>Analyzer</a> subclass affects search results.</li>
+
+<li><a href="../../Lucy/Docs/Tutorial/HighlighterTutorial.html" 
class="podlinkpod"
+>HighlighterTutorial</a> - Augment search results with highlighted 
excerpts.</li>
+
+<li><a href="../../Lucy/Docs/Tutorial/QueryObjectsTutorial.html" 
class="podlinkpod"
+>QueryObjectsTutorial</a> - Unlock advanced search features by using Query 
objects instead of query strings.</li>
+</ul>
+
+<h3><a class='u'
+name="Source_materials"
+>Source materials</a></h3>
+
+<p>The source material used by the tutorial app &#8211; a multi-text-file 
presentation of the United States constitution &#8211; can be found in the 
<code>sample</code> directory at the root of the Lucy distribution,
+along with finished indexing and search apps.</p>
+
+<pre>sample/indexer.pl        # indexing app
+sample/search.cgi        # search app
+sample/us_constitution   # corpus</pre>
+
+<h3><a class='u'
+name="Conventions"
+>Conventions</a></h3>
+
+<p>The user is expected to be familiar with OO Perl and basic CGI 
programming.</p>
+
+<p>The code in this tutorial assumes a Unix-flavored operating system and the 
Apache webserver,
+but will work with minor modifications on other setups.</p>
+
+<h3><a class='u'
+name="See_also"
+>See also</a></h3>
+
+<p>More advanced and esoteric subjects are covered in <a 
href="../../Lucy/Docs/Cookbook.html" class="podlinkpod"
+>Cookbook</a>.</p>
+
+</div>

Added: 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/AnalysisTutorial.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/AnalysisTutorial.mdtext?rev=1737642&view=auto
==============================================================================
--- 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/AnalysisTutorial.mdtext 
(added)
+++ 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/AnalysisTutorial.mdtext 
Mon Apr  4 09:22:30 2016
@@ -0,0 +1,107 @@
+Title: Lucy::Docs::Tutorial::AnalysisTutorial – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Docs::Tutorial::AnalysisTutorial - How to choose and use 
Analyzers.</p>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>Try swapping out the EasyAnalyzer in our Schema for a <a 
href="../../../Lucy/Analysis/StandardTokenizer.html" class="podlinkpod"
+>StandardTokenizer</a>:</p>
+
+<pre>my $tokenizer = Lucy::Analysis::StandardTokenizer-&#62;new;
+my $type = Lucy::Plan::FullTextType-&#62;new(
+    analyzer =&#62; $tokenizer,
+);</pre>
+
+<p>Search for <code>senate</code>,
+<code>Senate</code>,
+and <code>Senator</code> before and after making the change and 
re-indexing.</p>
+
+<p>Under EasyAnalyzer,
+the results are identical for all three searches,
+but under StandardTokenizer,
+searches are case-sensitive,
+and the result sets for <code>Senate</code> and <code>Senator</code> are 
distinct.</p>
+
+<h3><a class='u'
+name="EasyAnalyzer"
+>EasyAnalyzer</a></h3>
+
+<p>What&#8217;s happening is that <a 
href="../../../Lucy/Analysis/EasyAnalyzer.html" class="podlinkpod"
+>EasyAnalyzer</a> is performing more aggressive processing than 
StandardTokenizer.
+In addition to tokenizing,
+it&#8217;s also converting all text to lower case so that searches are 
case-insensitive,
+and using a &#8220;stemming&#8221; algorithm to reduce related words to a 
common stem (<code>senat</code>,
+in this case).</p>
+
+<p>EasyAnalyzer is actually multiple Analyzers wrapped up in a single package.
+In this case,
+it&#8217;s three-in-one,
+since specifying a EasyAnalyzer with <code>language =&#62; &#39;en&#39;</code> 
is equivalent to this snippet creating a <a 
href="../../../Lucy/Analysis/PolyAnalyzer.html" class="podlinkpod"
+>PolyAnalyzer</a>:</p>
+
+<pre>my $tokenizer    = Lucy::Analysis::StandardTokenizer-&#62;new;
+my $normalizer   = Lucy::Analysis::Normalizer-&#62;new;
+my $stemmer      = Lucy::Analysis::SnowballStemmer-&#62;new( language =&#62; 
&#39;en&#39; );
+my $polyanalyzer = Lucy::Analysis::PolyAnalyzer-&#62;new(
+    analyzers =&#62; [ $tokenizer, $normalizer, $stemmer ],
+);</pre>
+
+<p>You can add or subtract Analyzers from there if you like.
+Try adding a fourth Analyzer,
+a SnowballStopFilter for suppressing &#8220;stopwords&#8221; like 
&#8220;the&#8221;,
+&#8220;if&#8221;,
+and &#8220;maybe&#8221;.</p>
+
+<pre>my $stopfilter = Lucy::Analysis::SnowballStopFilter-&#62;new( 
+    language =&#62; &#39;en&#39;,
+);
+my $polyanalyzer = Lucy::Analysis::PolyAnalyzer-&#62;new(
+    analyzers =&#62; [ $tokenizer, $normalizer, $stopfilter, $stemmer ],
+);</pre>
+
+<p>Also,
+try removing the SnowballStemmer.</p>
+
+<pre>my $polyanalyzer = Lucy::Analysis::PolyAnalyzer-&#62;new(
+    analyzers =&#62; [ $tokenizer, $normalizer ],
+);</pre>
+
+<p>The original choice of a stock English EasyAnalyzer probably still yields 
the best results for this document collection,
+but you get the idea: sometimes you want a different Analyzer.</p>
+
+<h3><a class='u'
+name="When_the_best_Analyzer_is_no_Analyzer"
+>When the best Analyzer is no Analyzer</a></h3>
+
+<p>Sometimes you don&#8217;t want an Analyzer at all.
+That was true for our &#8220;url&#8221; field because we didn&#8217;t need it 
to be searchable,
+but it&#8217;s also true for certain types of searchable fields.
+For instance,
+&#8220;category&#8221; fields are often set up to match exactly or not at all,
+as are fields like &#8220;last_name&#8221; (because you may not want to 
conflate results for &#8220;Humphrey&#8221; and &#8220;Humphries&#8221;).</p>
+
+<p>To specify that there should be no analysis performed at all,
+use StringType:</p>
+
+<pre>my $type = Lucy::Plan::StringType-&#62;new;
+$schema-&#62;spec_field( name =&#62; &#39;category&#39;, type =&#62; $type 
);</pre>
+
+<h3><a class='u'
+name="Highlighting_up_next"
+>Highlighting up next</a></h3>
+
+<p>In our next tutorial chapter,
+<a href="../../../Lucy/Docs/Tutorial/HighlighterTutorial.html" 
class="podlinkpod"
+>HighlighterTutorial</a>,
+we&#8217;ll add highlighted excerpts from the &#8220;content&#8221; field to 
our search results.</p>
+
+</div>

Added: 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/BeyondSimpleTutorial.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/BeyondSimpleTutorial.mdtext?rev=1737642&view=auto
==============================================================================
--- 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/BeyondSimpleTutorial.mdtext
 (added)
+++ 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/BeyondSimpleTutorial.mdtext
 Mon Apr  4 09:22:30 2016
@@ -0,0 +1,158 @@
+Title: Lucy::Docs::Tutorial::BeyondSimpleTutorial – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Docs::Tutorial::BeyondSimpleTutorial - A more flexible app 
structure.</p>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<h3><a class='u'
+name="Goal"
+>Goal</a></h3>
+
+<p>In this tutorial chapter,
+we&#8217;ll refactor the apps we built in <a 
href="../../../Lucy/Docs/Tutorial/SimpleTutorial.html" class="podlinkpod"
+>SimpleTutorial</a> so that they look exactly the same from the end 
user&#8217;s point of view,
+but offer the developer greater possibilites for expansion.</p>
+
+<p>To achieve this,
+we&#8217;ll ditch Lucy::Simple and replace it with the classes that it uses 
internally:</p>
+
+<ul>
+<li><a href="../../../Lucy/Plan/Schema.html" class="podlinkpod"
+>Schema</a> - Plan out your index.</li>
+
+<li><a href="../../../Lucy/Plan/FullTextType.html" class="podlinkpod"
+>FullTextType</a> - Field type for full text search.</li>
+
+<li><a href="../../../Lucy/Analysis/EasyAnalyzer.html" class="podlinkpod"
+>EasyAnalyzer</a> - A one-size-fits-all parser/tokenizer.</li>
+
+<li><a href="../../../Lucy/Index/Indexer.html" class="podlinkpod"
+>Indexer</a> - Manipulate index content.</li>
+
+<li><a href="../../../Lucy/Search/IndexSearcher.html" class="podlinkpod"
+>IndexSearcher</a> - Search an index.</li>
+
+<li><a href="../../../Lucy/Search/Hits.html" class="podlinkpod"
+>Hits</a> - Iterate over hits returned by a Searcher.</li>
+</ul>
+
+<h3><a class='u'
+name="Adaptations_to_indexer.pl"
+>Adaptations to indexer.pl</a></h3>
+
+<p>After we load our modules&#8230;</p>
+
+<pre>use Lucy::Plan::Schema;
+use Lucy::Plan::FullTextType;
+use Lucy::Analysis::EasyAnalyzer;
+use Lucy::Index::Indexer;</pre>
+
+<p>&#8230; the first item we&#8217;re going need is a <a 
href="../../../Lucy/Plan/Schema.html" class="podlinkpod"
+>Schema</a>.</p>
+
+<p>The primary job of a Schema is to specify what fields are available and how 
they&#8217;re defined.
+We&#8217;ll start off with three fields: title,
+content and url.</p>
+
+<pre># Create Schema.
+my $schema = Lucy::Plan::Schema-&#62;new;
+my $easyanalyzer = Lucy::Analysis::EasyAnalyzer-&#62;new(
+    language =&#62; &#39;en&#39;,
+);
+my $type = Lucy::Plan::FullTextType-&#62;new(
+    analyzer =&#62; $easyanalyzer,
+);
+$schema-&#62;spec_field( name =&#62; &#39;title&#39;,   type =&#62; $type );
+$schema-&#62;spec_field( name =&#62; &#39;content&#39;, type =&#62; $type );
+$schema-&#62;spec_field( name =&#62; &#39;url&#39;,     type =&#62; $type 
);</pre>
+
+<p>All of the fields are spec&#8217;d out using the <a 
href="../../../Lucy/Plan/FullTextType.html" class="podlinkpod"
+>FullTextType</a> FieldType,
+indicating that they will be searchable as &#8220;full text&#8221; &#8211; 
which means that they can be searched for individual words.
+The &#8220;analyzer&#8221;,
+which is unique to FullTextType fields,
+is what breaks up the text into searchable tokens.</p>
+
+<p>Next,
+we&#8217;ll swap our Lucy::Simple object out for an <a 
href="../../../Lucy/Index/Indexer.html" class="podlinkpod"
+>Indexer</a>.
+The substitution will be straightforward because Simple has merely been 
serving as a thin wrapper around an inner Indexer,
+and we&#8217;ll just be peeling away the wrapper.</p>
+
+<p>First,
+replace the constructor:</p>
+
+<pre># Create Indexer.
+my $indexer = Lucy::Index::Indexer-&#62;new(
+    index    =&#62; $path_to_index,
+    schema   =&#62; $schema,
+    create   =&#62; 1,
+    truncate =&#62; 1,
+);</pre>
+
+<p>Next,
+have the <code>indexer</code> object <a 
href="../../../Lucy/Index/Indexer.html#add_doc" class="podlinkpod"
+>add_doc()</a> where we were having the <code>lucy</code> object adding the 
document before:</p>
+
+<pre>foreach my $filename (@filenames) {
+    my $doc = parse_file($filename);
+    $indexer-&#62;add_doc($doc);
+}</pre>
+
+<p>There&#8217;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.
+(Lucy::Simple hides this detail,
+calling commit() implicitly when it needs to).</p>
+
+<pre>$indexer-&#62;commit;</pre>
+
+<h3><a class='u'
+name="Adaptations_to_search.cgi"
+>Adaptations to search.cgi</a></h3>
+
+<p>In our search app as in our indexing app,
+Lucy::Simple has served as a thin wrapper &#8211; this time around <a 
href="../../../Lucy/Search/IndexSearcher.html" class="podlinkpod"
+>IndexSearcher</a> and <a href="../../../Lucy/Search/Hits.html" 
class="podlinkpod"
+>Hits</a>.
+Swapping out Simple for these two classes is also straightforward:</p>
+
+<pre>use Lucy::Search::IndexSearcher;
+
+my $searcher = Lucy::Search::IndexSearcher-&#62;new( 
+    index =&#62; $path_to_index,
+);
+my $hits = $searcher-&#62;hits(    # returns a Hits object, not a hit count
+    query      =&#62; $q,
+    offset     =&#62; $offset,
+    num_wanted =&#62; $page_size,
+);
+my $hit_count = $hits-&#62;total_hits;  # get the hit count here
+
+...
+
+while ( my $hit = $hits-&#62;next ) {
+    ...
+}</pre>
+
+<h3><a class='u'
+name="Hooray!"
+>Hooray!</a></h3>
+
+<p>Congratulations!
+Your apps do the same thing as before&#8230; but now they&#8217;ll be easier 
to customize.</p>
+
+<p>In our next chapter,
+<a href="../../../Lucy/Docs/Tutorial/FieldTypeTutorial.html" class="podlinkpod"
+>FieldTypeTutorial</a>,
+we&#8217;ll explore how to assign different behaviors to different fields.</p>
+
+</div>

Added: 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/FieldTypeTutorial.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/FieldTypeTutorial.mdtext?rev=1737642&view=auto
==============================================================================
--- 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/FieldTypeTutorial.mdtext 
(added)
+++ 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/FieldTypeTutorial.mdtext 
Mon Apr  4 09:22:30 2016
@@ -0,0 +1,81 @@
+Title: Lucy::Docs::Tutorial::FieldTypeTutorial – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Docs::Tutorial::FieldTypeTutorial - Specify per-field properties and 
behaviors.</p>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>The Schema we used in the last chapter specifies three fields:</p>
+
+<pre>my $type = Lucy::Plan::FullTextType-&#62;new(
+    analyzer =&#62; $easyanalyzer,
+);
+$schema-&#62;spec_field( name =&#62; &#39;title&#39;,   type =&#62; $type );
+$schema-&#62;spec_field( name =&#62; &#39;content&#39;, type =&#62; $type );
+$schema-&#62;spec_field( name =&#62; &#39;url&#39;,     type =&#62; $type 
);</pre>
+
+<p>Since they are all defined as &#8220;full text&#8221; fields,
+they are all searchable &#8211; including the <code>url</code> field,
+a dubious choice.
+Some URLs contain meaningful information,
+but these don&#8217;t,
+really:</p>
+
+<pre>http://example.com/us_constitution/amend1.txt</pre>
+
+<p>We may as well not bother indexing the URL content.
+To achieve that we need to assign the <code>url</code> field to a different 
FieldType.</p>
+
+<h3><a class='u'
+name="StringType"
+>StringType</a></h3>
+
+<p>Instead of FullTextType,
+we&#8217;ll use a <a href="../../../Lucy/Plan/StringType.html" 
class="podlinkpod"
+>StringType</a>,
+which doesn&#8217;t use an Analyzer to break up text into individual fields.
+Furthermore,
+we&#8217;ll mark this StringType as unindexed,
+so that its content won&#8217;t be searchable at all.</p>
+
+<pre>my $url_type = Lucy::Plan::StringType-&#62;new( indexed =&#62; 0 );
+$schema-&#62;spec_field( name =&#62; &#39;url&#39;, type =&#62; $url_type 
);</pre>
+
+<p>To observe the change in behavior,
+try searching for <code>us_constitution</code> both before and after changing 
the Schema and re-indexing.</p>
+
+<h3><a class='u'
+name="Toggling_(8216)stored(8217)"
+>Toggling &#8216;stored&#8217;</a></h3>
+
+<p>For a taste of other FieldType possibilities,
+try turning off <code>stored</code> for one or more fields.</p>
+
+<pre>my $content_type = Lucy::Plan::FullTextType-&#62;new(
+    analyzer =&#62; $easyanalyzer,
+    stored   =&#62; 0,
+);</pre>
+
+<p>Turning off <code>stored</code> for either <code>title</code> or 
<code>url</code> mangles our results page,
+but since we&#8217;re not displaying <code>content</code>,
+turning it off for <code>content</code> has no effect &#8211; except on index 
size.</p>
+
+<h3><a class='u'
+name="Analyzers_up_next"
+>Analyzers up next</a></h3>
+
+<p>Analyzers play a crucial role in the behavior of FullTextType fields.
+In our next tutorial chapter,
+<a href="../../../Lucy/Docs/Tutorial/AnalysisTutorial.html" class="podlinkpod"
+>AnalysisTutorial</a>,
+we&#8217;ll see how changing up the Analyzer changes search results.</p>
+
+</div>

Added: 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/HighlighterTutorial.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/HighlighterTutorial.mdtext?rev=1737642&view=auto
==============================================================================
--- 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/HighlighterTutorial.mdtext 
(added)
+++ 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/HighlighterTutorial.mdtext 
Mon Apr  4 09:22:30 2016
@@ -0,0 +1,76 @@
+Title: Lucy::Docs::Tutorial::HighlighterTutorial – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Docs::Tutorial::HighlighterTutorial - Augment search results with 
highlighted excerpts.</p>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>Adding relevant excerpts with highlighted search terms to your search 
results display makes it much easier for end users to scan the page and assess 
which hits look promising,
+dramatically improving their search experience.</p>
+
+<h3><a class='u'
+name="Adaptations_to_indexer.pl"
+>Adaptations to indexer.pl</a></h3>
+
+<p><a href="../../../Lucy/Highlight/Highlighter.html" class="podlinkpod"
+>Highlighter</a> uses information generated at index time.
+To save resources,
+highlighting is disabled by default and must be turned on for individual 
fields.</p>
+
+<pre>my $highlightable = Lucy::Plan::FullTextType-&#62;new(
+    analyzer      =&#62; $easyanalyzer,
+    highlightable =&#62; 1,
+);
+$schema-&#62;spec_field( name =&#62; &#39;content&#39;, type =&#62; 
$highlightable );</pre>
+
+<h3><a class='u'
+name="Adaptations_to_search.cgi"
+>Adaptations to search.cgi</a></h3>
+
+<p>To add highlighting and excerpting to the search.cgi sample app,
+create a <code>$highlighter</code> object outside the hits iterating 
loop&#8230;</p>
+
+<pre>my $highlighter = Lucy::Highlight::Highlighter-&#62;new(
+    searcher =&#62; $searcher,
+    query    =&#62; $q,
+    field    =&#62; &#39;content&#39;
+);</pre>
+
+<p>&#8230; then modify the loop and the per-hit display to generate and 
include the excerpt.</p>
+
+<pre># Create result list.
+my $report = &#39;&#39;;
+while ( my $hit = $hits-&#62;next ) {
+    my $score   = sprintf( &#34;%0.3f&#34;, $hit-&#62;get_score );
+    my $excerpt = $highlighter-&#62;create_excerpt($hit);
+    $report .= qq|
+        &#60;p&#62;
+          &#60;a 
href=&#34;$hit-&#62;{url}&#34;&#62;&#60;strong&#62;$hit-&#62;{title}&#60;/strong&#62;&#60;/a&#62;
+          &#60;em&#62;$score&#60;/em&#62;
+          &#60;br /&#62;
+          $excerpt
+          &#60;br /&#62;
+          &#60;span 
class=&#34;excerptURL&#34;&#62;$hit-&#62;{url}&#60;/span&#62;
+        &#60;/p&#62;
+    |;
+}</pre>
+
+<h3><a class='u'
+name="Next_chapter:_Query_objects"
+>Next chapter: Query objects</a></h3>
+
+<p>Our next tutorial chapter,
+<a href="../../../Lucy/Docs/Tutorial/QueryObjectsTutorial.html" 
class="podlinkpod"
+>QueryObjectsTutorial</a>,
+illustrates how to build an &#8220;advanced search&#8221; interface using <a 
href="../../../Lucy/Search/Query.html" class="podlinkpod"
+>Query</a> objects instead of query strings.</p>
+
+</div>

Added: 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/QueryObjectsTutorial.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/QueryObjectsTutorial.mdtext?rev=1737642&view=auto
==============================================================================
--- 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/QueryObjectsTutorial.mdtext
 (added)
+++ 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/QueryObjectsTutorial.mdtext
 Mon Apr  4 09:22:30 2016
@@ -0,0 +1,202 @@
+Title: Lucy::Docs::Tutorial::QueryObjectsTutorial – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Docs::Tutorial::QueryObjectsTutorial - Use Query objects instead of 
query strings.</p>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>Until now,
+our search app has had only a single search box.
+In this tutorial chapter,
+we&#8217;ll move towards an &#8220;advanced search&#8221; interface,
+by adding a &#8220;category&#8221; drop-down menu.
+Three new classes will be required:</p>
+
+<ul>
+<li><a href="../../../Lucy/Search/QueryParser.html" class="podlinkpod"
+>QueryParser</a> - Turn a query string into a <a 
href="../../../Lucy/Search/Query.html" class="podlinkpod"
+>Query</a> object.</li>
+
+<li><a href="../../../Lucy/Search/TermQuery.html" class="podlinkpod"
+>TermQuery</a> - Query for a specific term within a specific field.</li>
+
+<li><a href="../../../Lucy/Search/ANDQuery.html" class="podlinkpod"
+>ANDQuery</a> - &#8220;AND&#8221; together multiple Query objects to produce 
an intersected result set.</li>
+</ul>
+
+<h3><a class='u'
+name="Adaptations_to_indexer.pl"
+>Adaptations to indexer.pl</a></h3>
+
+<p>Our new &#8220;category&#8221; field will be a StringType field rather than 
a FullTextType field,
+because we will only be looking for exact matches.
+It needs to be indexed,
+but since we won&#8217;t display its value,
+it doesn&#8217;t need to be stored.</p>
+
+<pre>my $cat_type = Lucy::Plan::StringType-&#62;new( stored =&#62; 0 );
+$schema-&#62;spec_field( name =&#62; &#39;category&#39;, type =&#62; $cat_type 
);</pre>
+
+<p>There will be three possible values: &#8220;article&#8221;,
+&#8220;amendment&#8221;,
+and &#8220;preamble&#8221;,
+which we&#8217;ll hack out of the source file&#8217;s name during our 
<code>parse_file</code> subroutine:</p>
+
+<pre>my $category
+    = $filename =~ /art/      ? &#39;article&#39;
+    : $filename =~ /amend/    ? &#39;amendment&#39;
+    : $filename =~ /preamble/ ? &#39;preamble&#39;
+    :                           die &#34;Can&#39;t derive category for 
$filename&#34;;
+return {
+    title    =&#62; $title,
+    content  =&#62; $bodytext,
+    url      =&#62; &#34;/us_constitution/$filename&#34;,
+    category =&#62; $category,
+};</pre>
+
+<h3><a class='u'
+name="Adaptations_to_search.cgi"
+>Adaptations to search.cgi</a></h3>
+
+<p>The &#8220;category&#8221; constraint will be added to our search interface 
using an HTML &#8220;select&#8221; element (this routine will need to be 
integrated into the HTML generation section of search.cgi):</p>
+
+<pre># Build up the HTML &#34;select&#34; object for the &#34;category&#34; 
field.
+sub generate_category_select {
+    my $cat = shift;
+    my $select = qq|
+      &#60;select name=&#34;category&#34;&#62;
+        &#60;option value=&#34;&#34;&#62;All Sections&#60;/option&#62;
+        &#60;option value=&#34;article&#34;&#62;Articles&#60;/option&#62;
+        &#60;option value=&#34;amendment&#34;&#62;Amendments&#60;/option&#62;
+      &#60;/select&#62;|;
+    if ($cat) {
+        $select =~ s/&#34;$cat&#34;/&#34;$cat&#34; selected/;
+    }
+    return $select;
+}</pre>
+
+<p>We&#8217;ll start off by loading our new modules and extracting our new CGI 
parameter.</p>
+
+<pre>use Lucy::Search::QueryParser;
+use Lucy::Search::TermQuery;
+use Lucy::Search::ANDQuery;
+
+... 
+
+my $category = decode( &#34;UTF-8&#34;, $cgi-&#62;param(&#39;category&#39;) || 
&#39;&#39; );</pre>
+
+<p>QueryParser&#8217;s constructor requires a &#8220;schema&#8221; argument.
+We can get that from our IndexSearcher:</p>
+
+<pre># Create an IndexSearcher and a QueryParser.
+my $searcher = Lucy::Search::IndexSearcher-&#62;new( 
+    index =&#62; $path_to_index, 
+);
+my $qparser  = Lucy::Search::QueryParser-&#62;new( 
+    schema =&#62; $searcher-&#62;get_schema,
+);</pre>
+
+<p>Previously,
+we have been handing raw query strings to IndexSearcher.
+Behind the scenes,
+IndexSearcher has been using a QueryParser to turn those query strings into 
Query objects.
+Now,
+we will bring QueryParser into the foreground and parse the strings 
explicitly.</p>
+
+<pre>my $query = $qparser-&#62;parse($q);</pre>
+
+<p>If the user has specified a category,
+we&#8217;ll use an ANDQuery to join our parsed query together with a TermQuery 
representing the category.</p>
+
+<pre>if ($category) {
+    my $category_query = Lucy::Search::TermQuery-&#62;new(
+        field =&#62; &#39;category&#39;, 
+        term  =&#62; $category,
+    );
+    $query = Lucy::Search::ANDQuery-&#62;new(
+        children =&#62; [ $query, $category_query ]
+    );
+}</pre>
+
+<p>Now when we execute the query&#8230;</p>
+
+<pre># Execute the Query and get a Hits object.
+my $hits = $searcher-&#62;hits(
+    query      =&#62; $query,
+    offset     =&#62; $offset,
+    num_wanted =&#62; $page_size,
+);</pre>
+
+<p>&#8230; we&#8217;ll get a result set which is the intersection of the 
parsed query and the category query.</p>
+
+<h3><a class='u'
+name="Using_TermQuery_with_full_text_fields"
+>Using TermQuery with full text fields</a></h3>
+
+<p>When querying full text fields,
+the easiest way is to create query objects using QueryParser.
+But sometimes you want to create TermQuery for a single term in a FullTextType 
field directly.
+In this case,
+we have to run the search term through the field&#8217;s analyzer to make sure 
it gets normalized in the same way as the field&#8217;s content.</p>
+
+<pre>sub make_term_query {
+    my ($field, $term) = @_;
+
+    my $token;
+    my $type = $schema-&#62;fetch_type($field);
+
+    if ( $type-&#62;isa(&#39;Lucy::Plan::FullTextType&#39;) ) {
+        # Run the term through the full text analysis chain.
+        my $analyzer = $type-&#62;get_analyzer;
+        my $tokens   = $analyzer-&#62;split($term);
+
+        if ( @$tokens != 1 ) {
+            # If the term expands to more than one token, or no
+            # tokens at all, it will never match a token in the
+            # full text field.
+            return Lucy::Search::NoMatchQuery-&#62;new;
+        }
+
+        $token = $tokens-&#62;[0];
+    }
+    else {
+        # Exact match for other types.
+        $token = $term;
+    }
+
+    return Lucy::Search::TermQuery-&#62;new(
+        field =&#62; $field,
+        term  =&#62; $token,
+    );
+}</pre>
+
+<h3><a class='u'
+name="Congratulations!"
+>Congratulations!</a></h3>
+
+<p>You&#8217;ve made it to the end of the tutorial.</p>
+
+<h3><a class='u'
+name="See_Also"
+>See Also</a></h3>
+
+<p>For additional thematic documentation,
+see the Apache Lucy <a href="../../../Lucy/Docs/Cookbook.html" 
class="podlinkpod"
+>Cookbook</a>.</p>
+
+<p>ANDQuery has a companion class,
+<a href="../../../Lucy/Search/ORQuery.html" class="podlinkpod"
+>ORQuery</a>,
+and a close relative,
+<a href="../../../Lucy/Search/RequiredOptionalQuery.html" class="podlinkpod"
+>RequiredOptionalQuery</a>.</p>
+
+</div>

Added: 
lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/SimpleTutorial.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/SimpleTutorial.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/SimpleTutorial.mdtext 
(added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Docs/Tutorial/SimpleTutorial.mdtext 
Mon Apr  4 09:22:30 2016
@@ -0,0 +1,303 @@
+Title: Lucy::Docs::Tutorial::SimpleTutorial – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Docs::Tutorial::SimpleTutorial - Bare-bones search app.</p>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<h3><a class='u'
+name="Setup"
+>Setup</a></h3>
+
+<p>Copy the text presentation of the US Constitution from the 
<code>sample</code> directory of the Apache Lucy distribution to the base level 
of your web server&#8217;s <code>htdocs</code> directory.</p>
+
+<pre>$ cp -R sample/us_constitution /usr/local/apache2/htdocs/</pre>
+
+<h3><a class='u'
+name="Indexing:_indexer.pl"
+>Indexing: indexer.pl</a></h3>
+
+<p>Our first task will be to create an application called 
<code>indexer.pl</code> which builds a searchable &#8220;inverted index&#8221; 
from a collection of documents.</p>
+
+<p>After we specify some configuration variables and load all necessary 
modules&#8230;</p>
+
+<pre>#!/usr/local/bin/perl
+use strict;
+use warnings;
+
+# (Change configuration variables as needed.)
+my $path_to_index = &#39;/path/to/index&#39;;
+my $uscon_source  = &#39;/usr/local/apache2/htdocs/us_constitution&#39;;
+
+use Lucy::Simple;
+use File::Spec::Functions qw( catfile );</pre>
+
+<p>&#8230; we&#8217;ll start by creating a <a href="../../../Lucy/Simple.html" 
class="podlinkpod"
+>Lucy::Simple</a> object,
+telling it where we&#8217;d like the index to be located and the language of 
the source material.</p>
+
+<pre>my $lucy = Lucy::Simple-&#62;new(
+    path     =&#62; $path_to_index,
+    language =&#62; &#39;en&#39;,
+);</pre>
+
+<p>Next,
+we&#8217;ll add a subroutine which parses our sample documents.</p>
+
+<pre># Parse a file from our US Constitution collection and return a hashref 
with
+# the fields title, body, and url.
+sub parse_file {
+    my $filename = shift;
+    my $filepath = catfile( $uscon_source, $filename );
+    open( my $fh, &#39;&#60;&#39;, $filepath ) or die &#34;Can&#39;t open 
&#39;$filepath&#39;: $!&#34;;
+    my $text = do { local $/; &#60;$fh&#62; };    # slurp file content
+    $text =~ /\A(.+?)^\s+(.*)/ms
+        or die &#34;Can&#39;t extract title/bodytext from 
&#39;$filepath&#39;&#34;;
+    my $title    = $1;
+    my $bodytext = $2;
+    return {
+        title    =&#62; $title,
+        content  =&#62; $bodytext,
+        url      =&#62; &#34;/us_constitution/$filename&#34;,
+    };
+}</pre>
+
+<p>Add some elementary directory reading code&#8230;</p>
+
+<pre># Collect names of source files.
+opendir( my $dh, $uscon_source )
+    or die &#34;Couldn&#39;t opendir &#39;$uscon_source&#39;: $!&#34;;
+my @filenames = grep { $_ =~ /\.txt/ } readdir $dh;</pre>
+
+<p>&#8230; and now we&#8217;re ready for the meat of indexer.pl &#8211; which 
occupies exactly one line of code.</p>
+
+<pre>foreach my $filename (@filenames) {
+    my $doc = parse_file($filename);
+    $lucy-&#62;add_doc($doc);  # ta-da!
+}</pre>
+
+<h3><a class='u'
+name="Search:_search.cgi"
+>Search: search.cgi</a></h3>
+
+<p>As with our indexing app,
+the bulk of the code in our search script won&#8217;t be Lucy-specific.</p>
+
+<p>The beginning is dedicated to CGI processing and configuration.</p>
+
+<pre>#!/usr/local/bin/perl -T
+use strict;
+use warnings;
+
+# (Change configuration variables as needed.)
+my $path_to_index = &#39;/path/to/index&#39;;
+
+use CGI;
+use List::Util qw( max min );
+use POSIX qw( ceil );
+use Encode qw( decode );
+use Lucy::Simple;
+
+my $cgi       = CGI-&#62;new;
+my $q         = decode( &#34;UTF-8&#34;, $cgi-&#62;param(&#39;q&#39;) || 
&#39;&#39; );
+my $offset    = decode( &#34;UTF-8&#34;, $cgi-&#62;param(&#39;offset&#39;) || 
0 );
+my $page_size = 10;</pre>
+
+<p>Once that&#8217;s out of the way,
+we create our Lucy::Simple object and feed it a query string.</p>
+
+<pre>my $lucy = Lucy::Simple-&#62;new(
+    path     =&#62; $path_to_index,
+    language =&#62; &#39;en&#39;,
+);
+my $hit_count = $lucy-&#62;search(
+    query      =&#62; $q,
+    offset     =&#62; $offset,
+    num_wanted =&#62; $page_size,
+);</pre>
+
+<p>The value returned by <a href="../../../Lucy/Simple.html#search" 
class="podlinkpod"
+>search()</a> is the total number of documents in the collection which matched 
the query.
+We&#8217;ll show this hit count to the user,
+and also use it in conjunction with the parameters <code>offset</code> and 
<code>num_wanted</code> to break up results into &#8220;pages&#8221; of 
manageable size.</p>
+
+<p>Calling <a href="../../../Lucy/Simple.html#search" class="podlinkpod"
+>search()</a> on our Simple object turns it into an iterator.
+Invoking <a href="../../../Lucy/Simple.html#next" class="podlinkpod"
+>next()</a> now returns hits one at a time as <a 
href="../../../Lucy/Document/HitDoc.html" class="podlinkpod"
+>HitDoc</a> objects,
+starting with the most relevant.</p>
+
+<pre># Create result list.
+my $report = &#39;&#39;;
+while ( my $hit = $lucy-&#62;next ) {
+    my $score = sprintf( &#34;%0.3f&#34;, $hit-&#62;get_score );
+    $report .= qq|
+        &#60;p&#62;
+          &#60;a 
href=&#34;$hit-&#62;{url}&#34;&#62;&#60;strong&#62;$hit-&#62;{title}&#60;/strong&#62;&#60;/a&#62;
+          &#60;em&#62;$score&#60;/em&#62;
+          &#60;br&#62;
+          &#60;span 
class=&#34;excerptURL&#34;&#62;$hit-&#62;{url}&#60;/span&#62;
+        &#60;/p&#62;
+        |;
+}</pre>
+
+<p>The rest of the script is just text wrangling.</p>
+
+<pre>#---------------------------------------------------------------#
+# No tutorial material below this point - just html generation. #
+#---------------------------------------------------------------#
+
+# Generate paging links and hit count, print and exit.
+my $paging_links = generate_paging_info( $q, $hit_count );
+blast_out_content( $q, $report, $paging_links );
+
+# Create html fragment with links for paging through results n-at-a-time.
+sub generate_paging_info {
+    my ( $query_string, $total_hits ) = @_;
+    my $escaped_q = CGI::escapeHTML($query_string);
+    my $paging_info;
+    if ( !length $query_string ) {
+        # No query?  No display.
+        $paging_info = &#39;&#39;;
+    }
+    elsif ( $total_hits == 0 ) {
+        # Alert the user that their search failed.
+        $paging_info
+            = qq|&#60;p&#62;No matches for 
&#60;strong&#62;$escaped_q&#60;/strong&#62;&#60;/p&#62;|;
+    }
+    else {
+        # Calculate the nums for the first and last hit to display.
+        my $last_result = min( ( $offset + $page_size ), $total_hits );
+        my $first_result = min( ( $offset + 1 ), $last_result );
+
+        # Display the result nums, start paging info.
+        $paging_info = qq|
+            &#60;p&#62;
+                Results 
&#60;strong&#62;$first_result-$last_result&#60;/strong&#62; 
+                of &#60;strong&#62;$total_hits&#60;/strong&#62; 
+                for &#60;strong&#62;$escaped_q&#60;/strong&#62;.
+            &#60;/p&#62;
+            &#60;p&#62;
+                Results Page:
+            |;
+
+        # Calculate first and last hits pages to display / link to.
+        my $current_page = int( $first_result / $page_size ) + 1;
+        my $last_page    = ceil( $total_hits / $page_size );
+        my $first_page   = max( 1, ( $current_page - 9 ) );
+        $last_page = min( $last_page, ( $current_page + 10 ) );
+
+        # Create a url for use in paging links.
+        my $href = $cgi-&#62;url( -relative =&#62; 1 );
+        $href .= &#34;?q=&#34; . CGI::escape($query_string);
+        $href .= &#34;;offset=&#34; . CGI::escape($offset);
+
+        # Generate the &#34;Prev&#34; link.
+        if ( $current_page &#62; 1 ) {
+            my $new_offset = ( $current_page - 2 ) * $page_size;
+            $href =~ s/(?&#60;=offset=)\d+/$new_offset/;
+            $paging_info .= qq|&#60;a href=&#34;$href&#34;&#62;&#38;lt;= 
Prev&#60;/a&#62;\n|;
+        }
+
+        # Generate paging links.
+        for my $page_num ( $first_page .. $last_page ) {
+            if ( $page_num == $current_page ) {
+                $paging_info .= qq|$page_num \n|;
+            }
+            else {
+                my $new_offset = ( $page_num - 1 ) * $page_size;
+                $href =~ s/(?&#60;=offset=)\d+/$new_offset/;
+                $paging_info .= qq|&#60;a 
href=&#34;$href&#34;&#62;$page_num&#60;/a&#62;\n|;
+            }
+        }
+
+        # Generate the &#34;Next&#34; link.
+        if ( $current_page != $last_page ) {
+            my $new_offset = $current_page * $page_size;
+            $href =~ s/(?&#60;=offset=)\d+/$new_offset/;
+            $paging_info .= qq|&#60;a href=&#34;$href&#34;&#62;Next 
=&#38;gt;&#60;/a&#62;\n|;
+        }
+
+        # Close tag.
+        $paging_info .= &#34;&#60;/p&#62;\n&#34;;
+    }
+
+    return $paging_info;
+}
+
+# Print content to output.
+sub blast_out_content {
+    my ( $query_string, $hit_list, $paging_info ) = @_;
+    my $escaped_q = CGI::escapeHTML($query_string);
+    binmode( STDOUT, &#34;:encoding(UTF-8)&#34; );
+    print qq|Content-type: text/html; charset=UTF-8\n\n|;
+    print qq|
+&#60;!DOCTYPE html PUBLIC &#34;-//W3C//DTD HTML 4.01 Transitional//EN&#34;
+    &#34;http://www.w3.org/TR/html4/loose.dtd&#34;&#62;
+&#60;html&#62;
+&#60;head&#62;
+  &#60;meta http-equiv=&#34;Content-type&#34; 
+    content=&#34;text/html;charset=UTF-8&#34;&#62;
+  &#60;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; 
+    href=&#34;/us_constitution/uscon.css&#34;&#62;
+  &#60;title&#62;Lucy: $escaped_q&#60;/title&#62;
+&#60;/head&#62;
+
+&#60;body&#62;
+
+  &#60;div id=&#34;navigation&#34;&#62;
+    &#60;form id=&#34;usconSearch&#34; action=&#34;&#34;&#62;
+      &#60;strong&#62;
+        Search the 
+        &#60;a href=&#34;/us_constitution/index.html&#34;&#62;US 
Constitution&#60;/a&#62;:
+      &#60;/strong&#62;
+      &#60;input type=&#34;text&#34; name=&#34;q&#34; id=&#34;q&#34; 
value=&#34;$escaped_q&#34;&#62;
+      &#60;input type=&#34;submit&#34; value=&#34;=&#38;gt;&#34;&#62;
+    &#60;/form&#62;
+  &#60;/div&#62;&#60;!--navigation--&#62;
+
+  &#60;div id=&#34;bodytext&#34;&#62;
+
+  $hit_list
+
+  $paging_info
+
+    &#60;p style=&#34;font-size: smaller; color: #666&#34;&#62;
+      &#60;em&#62;
+        Powered by &#60;a href=&#34;http://lucy.apache.org/&#34;
+        &#62;Apache 
Lucy&#60;small&#62;&#60;sup&#62;TM&#60;/sup&#62;&#60;/small&#62;&#60;/a&#62;
+      &#60;/em&#62;
+    &#60;/p&#62;
+  &#60;/div&#62;&#60;!--bodytext--&#62;
+
+&#60;/body&#62;
+
+&#60;/html&#62;
+|;
+}</pre>
+
+<h3><a class='u'
+name="OK(8230)_now_what?"
+>OK&#8230; now what?</a></h3>
+
+<p>Lucy::Simple is perfectly adequate for some tasks,
+but it&#8217;s not very flexible.
+Many people find that it doesn&#8217;t do at least one or two things they 
can&#8217;t live without.</p>
+
+<p>In our next tutorial chapter,
+<a href="../../../Lucy/Docs/Tutorial/BeyondSimpleTutorial.html" 
class="podlinkpod"
+>BeyondSimpleTutorial</a>,
+we&#8217;ll rewrite our indexing and search scripts using the classes that 
Lucy::Simple hides from view,
+opening up the possibilities for expansion; then,
+we&#8217;ll spend the rest of the tutorial chapters exploring these 
possibilities.</p>
+
+</div>

Added: lucy/site/trunk/content/docs/perl/Lucy/Document/Doc.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Document/Doc.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Document/Doc.mdtext (added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Document/Doc.mdtext Mon Apr  4 
09:22:30 2016
@@ -0,0 +1,128 @@
+Title: Lucy::Document::Doc – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Document::Doc - A document.</p>
+
+<h2><a class='u'
+name="SYNOPSIS"
+>SYNOPSIS</a></h2>
+
+<pre>my $doc = Lucy::Document::Doc-&#62;new(
+    fields =&#62; { foo =&#62; &#39;foo foo&#39;, bar =&#62; &#39;bar bar&#39; 
},
+);
+$indexer-&#62;add_doc($doc);</pre>
+
+<p>Doc objects allow access to field values via hashref overloading:</p>
+
+<pre>$doc-&#62;{foo} = &#39;new value for field &#34;foo&#34;&#39;;
+print &#34;foo: $doc-&#62;{foo}\n&#34;;</pre>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>A Doc object is akin to a row in a database,
+in that it is made up of one or more fields,
+each of which has a value.</p>
+
+<h2><a class='u'
+name="CONSTRUCTORS"
+>CONSTRUCTORS</a></h2>
+
+<h3><a class='u'
+name="new"
+>new</a></h3>
+
+<pre>my $doc = Lucy::Document::Doc-&#62;new(
+    fields =&#62; { foo =&#62; &#39;foo foo&#39;, bar =&#62; &#39;bar bar&#39; 
},
+);</pre>
+
+<p>Create a new Document.</p>
+
+<ul>
+<li><b>fields</b> - Field-value pairs.</li>
+
+<li><b>doc_id</b> - Internal Lucy document id.
+Default of 0 (an invalid doc id).</li>
+</ul>
+
+<h2><a class='u'
+name="METHODS"
+>METHODS</a></h2>
+
+<h3><a class='u'
+name="set_doc_id"
+>set_doc_id</a></h3>
+
+<pre>$doc-&#62;set_doc_id($doc_id);</pre>
+
+<p>Set internal Lucy document id.</p>
+
+<h3><a class='u'
+name="get_doc_id"
+>get_doc_id</a></h3>
+
+<pre>my $int = $doc-&#62;get_doc_id();</pre>
+
+<p>Retrieve internal Lucy document id.</p>
+
+<h3><a class='u'
+name="store"
+>store</a></h3>
+
+<pre>$doc-&#62;store($field, $value);</pre>
+
+<p>Store a field value in the Doc.</p>
+
+<ul>
+<li><b>field</b> - The field name.</li>
+
+<li><b>value</b> - The value.</li>
+</ul>
+
+<h3><a class='u'
+name="get_fields"
+>get_fields</a></h3>
+
+<pre>my $hashref = $doc-&#62;get_fields();</pre>
+
+<p>Return the Doc&#39;s backing fields hash.</p>
+
+<h3><a class='u'
+name="get_size"
+>get_size</a></h3>
+
+<pre>my $int = $doc-&#62;get_size();</pre>
+
+<p>Return the number of fields in the Doc.</p>
+
+<h3><a class='u'
+name="extract"
+>extract</a></h3>
+
+<pre>my $obj = $doc-&#62;extract($field);</pre>
+
+<p>Retrieve the field&#8217;s value,
+or NULL if the field is not present.</p>
+
+<h3><a class='u'
+name="field_names"
+>field_names</a></h3>
+
+<pre>my $arrayref = $doc-&#62;field_names();</pre>
+
+<p>Return a list of names of all fields present.</p>
+
+<h2><a class='u'
+name="INHERITANCE"
+>INHERITANCE</a></h2>
+
+<p>Lucy::Document::Doc isa Clownfish::Obj.</p>
+
+</div>

Added: lucy/site/trunk/content/docs/perl/Lucy/Document/HitDoc.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Document/HitDoc.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Document/HitDoc.mdtext (added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Document/HitDoc.mdtext Mon Apr  4 
09:22:30 2016
@@ -0,0 +1,55 @@
+Title: Lucy::Document::HitDoc – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Document::HitDoc - A document read from an index.</p>
+
+<h2><a class='u'
+name="SYNOPSIS"
+>SYNOPSIS</a></h2>
+
+<pre>while ( my $hit_doc = $hits-&#62;next ) {
+    print &#34;$hit_doc-&#62;{title}\n&#34;;
+    print $hit_doc-&#62;get_score . &#34;\n&#34;;
+    ...
+}</pre>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>HitDoc is the search-time relative of the index-time class Doc; it is 
augmented by a numeric score attribute that Doc doesn&#8217;t have.</p>
+
+<h2><a class='u'
+name="METHODS"
+>METHODS</a></h2>
+
+<h3><a class='u'
+name="set_score"
+>set_score</a></h3>
+
+<pre>$hit_doc-&#62;set_score($score);</pre>
+
+<p>Set score attribute.</p>
+
+<h3><a class='u'
+name="get_score"
+>get_score</a></h3>
+
+<pre>my $float = $hit_doc-&#62;get_score();</pre>
+
+<p>Get score attribute.</p>
+
+<h2><a class='u'
+name="INHERITANCE"
+>INHERITANCE</a></h2>
+
+<p>Lucy::Document::HitDoc isa <a href="../../Lucy/Document/Doc.html" 
class="podlinkpod"
+>Lucy::Document::Doc</a> isa Clownfish::Obj.</p>
+
+</div>

Added: lucy/site/trunk/content/docs/perl/Lucy/Highlight/Highlighter.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Highlight/Highlighter.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Highlight/Highlighter.mdtext (added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Highlight/Highlighter.mdtext Mon Apr 
 4 09:22:30 2016
@@ -0,0 +1,184 @@
+Title: Lucy::Highlight::Highlighter – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Highlight::Highlighter - Create and highlight excerpts.</p>
+
+<h2><a class='u'
+name="SYNOPSIS"
+>SYNOPSIS</a></h2>
+
+<pre>my $highlighter = Lucy::Highlight::Highlighter-&#62;new(
+    searcher =&#62; $searcher,
+    query    =&#62; $query,
+    field    =&#62; &#39;body&#39;
+);
+my $hits = $searcher-&#62;hits( query =&#62; $query );
+while ( my $hit = $hits-&#62;next ) {
+    my $excerpt = $highlighter-&#62;create_excerpt($hit);
+    ...
+}</pre>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>The Highlighter can be used to select relevant snippets from a document,
+and to surround search terms with highlighting tags.
+It handles both stems and phrases correctly and efficiently,
+using special-purpose data generated at index-time.</p>
+
+<h2><a class='u'
+name="CONSTRUCTORS"
+>CONSTRUCTORS</a></h2>
+
+<h3><a class='u'
+name="new"
+>new</a></h3>
+
+<pre>my $highlighter = Lucy::Highlight::Highlighter-&#62;new(
+    searcher       =&#62; $searcher,    # required
+    query          =&#62; $query,       # required
+    field          =&#62; &#39;content&#39;,    # required
+    excerpt_length =&#62; 150,          # default: 200
+);</pre>
+
+<p>Create a new Highlighter.</p>
+
+<ul>
+<li><b>searcher</b> - An object which inherits from <a 
href="../../Lucy/Search/Searcher.html" class="podlinkpod"
+>Searcher</a>,
+such as an <a href="../../Lucy/Search/IndexSearcher.html" class="podlinkpod"
+>IndexSearcher</a>.</li>
+
+<li><b>query</b> - Query object or a query string.</li>
+
+<li><b>field</b> - The name of the field from which to draw the excerpt.
+The field must marked as be <code>highlightable</code> (see <a 
href="../../Lucy/Plan/FieldType.html" class="podlinkpod"
+>FieldType</a>).</li>
+
+<li><b>excerpt_length</b> - Maximum length of the excerpt,
+in characters.</li>
+</ul>
+
+<h2><a class='u'
+name="METHODS"
+>METHODS</a></h2>
+
+<h3><a class='u'
+name="create_excerpt"
+>create_excerpt</a></h3>
+
+<pre>my $string = $highlighter-&#62;create_excerpt($hit_doc);</pre>
+
+<p>Take a HitDoc object and return a highlighted excerpt as a string if the 
HitDoc has a value for the specified <code>field</code>.</p>
+
+<h3><a class='u'
+name="encode"
+>encode</a></h3>
+
+<pre>my $string = $highlighter-&#62;encode($text);</pre>
+
+<p>Encode text with HTML entities.
+This method is called internally by <a href="#create_excerpt" 
class="podlinkpod"
+>create_excerpt()</a> for each text fragment when assembling an excerpt.
+A subclass can override this if the text should be encoded differently or not 
at all.</p>
+
+<h3><a class='u'
+name="highlight"
+>highlight</a></h3>
+
+<pre>my $string = $highlighter-&#62;highlight($text);</pre>
+
+<p>Highlight a small section of text.
+By default,
+prepends pre-tag and appends post-tag.
+This method is called internally by <a href="#create_excerpt" 
class="podlinkpod"
+>create_excerpt()</a> when assembling an excerpt.</p>
+
+<h3><a class='u'
+name="set_pre_tag"
+>set_pre_tag</a></h3>
+
+<pre>$highlighter-&#62;set_pre_tag($pre_tag);</pre>
+
+<p>Setter.
+The default value is &#8220;&#60;strong&#62;&#8221;.</p>
+
+<h3><a class='u'
+name="set_post_tag"
+>set_post_tag</a></h3>
+
+<pre>$highlighter-&#62;set_post_tag($post_tag);</pre>
+
+<p>Setter.
+The default value is &#8220;&#60;/strong&#62;&#8221;.</p>
+
+<h3><a class='u'
+name="get_pre_tag"
+>get_pre_tag</a></h3>
+
+<pre>my $string = $highlighter-&#62;get_pre_tag();</pre>
+
+<p>Accessor.</p>
+
+<h3><a class='u'
+name="get_post_tag"
+>get_post_tag</a></h3>
+
+<pre>my $string = $highlighter-&#62;get_post_tag();</pre>
+
+<p>Accessor.</p>
+
+<h3><a class='u'
+name="get_field"
+>get_field</a></h3>
+
+<pre>my $string = $highlighter-&#62;get_field();</pre>
+
+<p>Accessor.</p>
+
+<h3><a class='u'
+name="get_excerpt_length"
+>get_excerpt_length</a></h3>
+
+<pre>my $int = $highlighter-&#62;get_excerpt_length();</pre>
+
+<p>Accessor.</p>
+
+<h3><a class='u'
+name="get_searcher"
+>get_searcher</a></h3>
+
+<pre>my $searcher = $highlighter-&#62;get_searcher();</pre>
+
+<p>Accessor.</p>
+
+<h3><a class='u'
+name="get_query"
+>get_query</a></h3>
+
+<pre>my $query = $highlighter-&#62;get_query();</pre>
+
+<p>Accessor.</p>
+
+<h3><a class='u'
+name="get_compiler"
+>get_compiler</a></h3>
+
+<pre>my $compiler = $highlighter-&#62;get_compiler();</pre>
+
+<p>Accessor for the Lucy::Search::Compiler object derived from 
<code>query</code> and <code>searcher</code>.</p>
+
+<h2><a class='u'
+name="INHERITANCE"
+>INHERITANCE</a></h2>
+
+<p>Lucy::Highlight::Highlighter isa Clownfish::Obj.</p>
+
+</div>

Added: lucy/site/trunk/content/docs/perl/Lucy/Index/BackgroundMerger.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Index/BackgroundMerger.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Index/BackgroundMerger.mdtext (added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Index/BackgroundMerger.mdtext Mon 
Apr  4 09:22:30 2016
@@ -0,0 +1,108 @@
+Title: Lucy::Index::BackgroundMerger – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Index::BackgroundMerger - Consolidate index segments in the 
background.</p>
+
+<h2><a class='u'
+name="SYNOPSIS"
+>SYNOPSIS</a></h2>
+
+<pre>my $bg_merger = Lucy::Index::BackgroundMerger-&#62;new(
+    index  =&#62; &#39;/path/to/index&#39;,
+);
+$bg_merger-&#62;commit;</pre>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>Adding documents to an index is usually fast,
+but every once in a while the index must be compacted and an update takes 
substantially longer to complete.
+See <a href="../../Lucy/Docs/Cookbook/FastUpdates.html" class="podlinkpod"
+>FastUpdates</a> for how to use this class to control worst-case index update 
performance.</p>
+
+<p>As with <a href="../../Lucy/Index/Indexer.html" class="podlinkpod"
+>Indexer</a>,
+see <a href="../../Lucy/Docs/FileLocking.html" class="podlinkpod"
+>FileLocking</a> if your index is on a shared volume.</p>
+
+<h2><a class='u'
+name="CONSTRUCTORS"
+>CONSTRUCTORS</a></h2>
+
+<h3><a class='u'
+name="new"
+>new</a></h3>
+
+<pre>my $bg_merger = Lucy::Index::BackgroundMerger-&#62;new(
+    index   =&#62; &#39;/path/to/index&#39;,    # required
+    manager =&#62; $manager             # default: created internally
+);</pre>
+
+<p>Open a new BackgroundMerger.</p>
+
+<ul>
+<li><b>index</b> - Either a string filepath or a Folder.</li>
+
+<li><b>manager</b> - An IndexManager.
+If not supplied,
+an IndexManager with a 10-second write lock timeout will be created.</li>
+</ul>
+
+<h2><a class='u'
+name="METHODS"
+>METHODS</a></h2>
+
+<h3><a class='u'
+name="optimize"
+>optimize</a></h3>
+
+<pre>$background_merger-&#62;optimize();</pre>
+
+<p>Optimize the index for search-time performance.
+This may take a while,
+as it can involve rewriting large amounts of data.</p>
+
+<h3><a class='u'
+name="commit"
+>commit</a></h3>
+
+<pre>$background_merger-&#62;commit();</pre>
+
+<p>Commit any changes made to the index.
+Until this is called,
+none of the changes made during an indexing session are permanent.</p>
+
+<p>Calls <a href="#prepare_commit" class="podlinkpod"
+>prepare_commit()</a> implicitly if it has not already been called.</p>
+
+<h3><a class='u'
+name="prepare_commit"
+>prepare_commit</a></h3>
+
+<pre>$background_merger-&#62;prepare_commit();</pre>
+
+<p>Perform the expensive setup for <a href="#commit" class="podlinkpod"
+>commit()</a> in advance,
+so that <a href="#commit" class="podlinkpod"
+>commit()</a> completes quickly.</p>
+
+<p>Towards the end of <a href="#prepare_commit" class="podlinkpod"
+>prepare_commit()</a>,
+the BackgroundMerger attempts to re-acquire the write lock,
+which is then held until <a href="#commit" class="podlinkpod"
+>commit()</a> finishes and releases it.</p>
+
+<h2><a class='u'
+name="INHERITANCE"
+>INHERITANCE</a></h2>
+
+<p>Lucy::Index::BackgroundMerger isa Clownfish::Obj.</p>
+
+</div>

Added: lucy/site/trunk/content/docs/perl/Lucy/Index/DataReader.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Index/DataReader.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Index/DataReader.mdtext (added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Index/DataReader.mdtext Mon Apr  4 
09:22:30 2016
@@ -0,0 +1,138 @@
+Title: Lucy::Index::DataReader – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Index::DataReader - Abstract base class for reading index data.</p>
+
+<h2><a class='u'
+name="SYNOPSIS"
+>SYNOPSIS</a></h2>
+
+<pre># Abstract base class.</pre>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>DataReader is the companion class to <a 
href="../../Lucy/Index/DataWriter.html" class="podlinkpod"
+>DataWriter</a>.
+Every index component will implement one of each.</p>
+
+<h2><a class='u'
+name="CONSTRUCTORS"
+>CONSTRUCTORS</a></h2>
+
+<h3><a class='u'
+name="new"
+>new</a></h3>
+
+<pre>my $reader = MyDataReader-&#62;new(
+    schema   =&#62; $seg_reader-&#62;get_schema,      # default undef
+    folder   =&#62; $seg_reader-&#62;get_folder,      # default undef
+    snapshot =&#62; $seg_reader-&#62;get_snapshot,    # default undef
+    segments =&#62; $seg_reader-&#62;get_segments,    # default undef
+    seg_tick =&#62; $seg_reader-&#62;get_seg_tick,    # default -1
+);</pre>
+
+<p>Abstract constructor.</p>
+
+<ul>
+<li><b>schema</b> - A Schema.</li>
+
+<li><b>folder</b> - A Folder.</li>
+
+<li><b>snapshot</b> - A Snapshot.</li>
+
+<li><b>segments</b> - An array of Segments.</li>
+
+<li><b>seg_tick</b> - The array index of the Segment object within the 
<code>segments</code> array that this particular DataReader is assigned to,
+if any.
+A value of -1 indicates that no Segment should be assigned.</li>
+</ul>
+
+<h2><a class='u'
+name="ABSTRACT_METHODS"
+>ABSTRACT METHODS</a></h2>
+
+<h3><a class='u'
+name="aggregator"
+>aggregator</a></h3>
+
+<pre>my $result = $data_reader-&#62;aggregator(
+    readers =&#62; $readers  # required
+    offsets =&#62; $offsets  # required
+);</pre>
+
+<p>Create a reader which aggregates the output of several lower level readers.
+Return undef if such a reader is not valid.</p>
+
+<ul>
+<li><b>readers</b> - An array of DataReaders.</li>
+
+<li><b>offsets</b> - Doc id start offsets for each reader.</li>
+</ul>
+
+<h2><a class='u'
+name="METHODS"
+>METHODS</a></h2>
+
+<h3><a class='u'
+name="get_schema"
+>get_schema</a></h3>
+
+<pre>my $schema = $data_reader-&#62;get_schema();</pre>
+
+<p>Accessor for &#8220;schema&#8221; member var.</p>
+
+<h3><a class='u'
+name="get_folder"
+>get_folder</a></h3>
+
+<pre>my $folder = $data_reader-&#62;get_folder();</pre>
+
+<p>Accessor for &#8220;folder&#8221; member var.</p>
+
+<h3><a class='u'
+name="get_snapshot"
+>get_snapshot</a></h3>
+
+<pre>my $snapshot = $data_reader-&#62;get_snapshot();</pre>
+
+<p>Accessor for &#8220;snapshot&#8221; member var.</p>
+
+<h3><a class='u'
+name="get_segments"
+>get_segments</a></h3>
+
+<pre>my $arrayref = $data_reader-&#62;get_segments();</pre>
+
+<p>Accessor for &#8220;segments&#8221; member var.</p>
+
+<h3><a class='u'
+name="get_segment"
+>get_segment</a></h3>
+
+<pre>my $segment = $data_reader-&#62;get_segment();</pre>
+
+<p>Accessor for &#8220;segment&#8221; member var.</p>
+
+<h3><a class='u'
+name="get_seg_tick"
+>get_seg_tick</a></h3>
+
+<pre>my $int = $data_reader-&#62;get_seg_tick();</pre>
+
+<p>Accessor for &#8220;seg_tick&#8221; member var.</p>
+
+<h2><a class='u'
+name="INHERITANCE"
+>INHERITANCE</a></h2>
+
+<p>Lucy::Index::DataReader isa Clownfish::Obj.</p>
+
+</div>

Added: lucy/site/trunk/content/docs/perl/Lucy/Index/DataWriter.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Index/DataWriter.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Index/DataWriter.mdtext (added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Index/DataWriter.mdtext Mon Apr  4 
09:22:30 2016
@@ -0,0 +1,202 @@
+Title: Lucy::Index::DataWriter – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Index::DataWriter - Write data to an index.</p>
+
+<h2><a class='u'
+name="SYNOPSIS"
+>SYNOPSIS</a></h2>
+
+<pre># Abstract base class.</pre>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>DataWriter is an abstract base class for writing index data,
+generally in segment-sized chunks.
+Each component of an index &#8211; e.g.
+stored fields,
+lexicon,
+postings,
+deletions &#8211; is represented by a DataWriter/<a 
href="../../Lucy/Index/DataReader.html" class="podlinkpod"
+>DataReader</a> pair.</p>
+
+<p>Components may be specified per index by subclassing <a 
href="../../Lucy/Plan/Architecture.html" class="podlinkpod"
+>Architecture</a>.</p>
+
+<h2><a class='u'
+name="CONSTRUCTORS"
+>CONSTRUCTORS</a></h2>
+
+<h3><a class='u'
+name="new"
+>new</a></h3>
+
+<pre>my $writer = MyDataWriter-&#62;new(
+    snapshot   =&#62; $snapshot,      # required
+    segment    =&#62; $segment,       # required
+    polyreader =&#62; $polyreader,    # required
+);</pre>
+
+<p>Abstract constructor.</p>
+
+<ul>
+<li><b>snapshot</b> - The Snapshot that will be committed at the end of the 
indexing session.</li>
+
+<li><b>segment</b> - The Segment in progress.</li>
+
+<li><b>polyreader</b> - A PolyReader representing all existing data in the 
index.
+(If the index is brand new,
+the PolyReader will have no sub-readers).</li>
+</ul>
+
+<h2><a class='u'
+name="ABSTRACT_METHODS"
+>ABSTRACT METHODS</a></h2>
+
+<h3><a class='u'
+name="add_segment"
+>add_segment</a></h3>
+
+<pre>$data_writer-&#62;add_segment(
+    reader  =&#62; $reader   # required
+    doc_map =&#62; $doc_map  # default: undef
+);</pre>
+
+<p>Add content from an existing segment into the one currently being 
written.</p>
+
+<ul>
+<li><b>reader</b> - The SegReader containing content to add.</li>
+
+<li><b>doc_map</b> - An array of integers mapping old document ids to new.
+Deleted documents are mapped to 0,
+indicating that they should be skipped.</li>
+</ul>
+
+<h3><a class='u'
+name="finish"
+>finish</a></h3>
+
+<pre>$data_writer-&#62;finish();</pre>
+
+<p>Complete the segment: close all streams,
+store metadata,
+etc.</p>
+
+<h3><a class='u'
+name="format"
+>format</a></h3>
+
+<pre>my $int = $data_writer-&#62;format();</pre>
+
+<p>Every writer must specify a file format revision number,
+which should increment each time the format changes.
+Responsibility for revision checking is left to the companion DataReader.</p>
+
+<h2><a class='u'
+name="METHODS"
+>METHODS</a></h2>
+
+<h3><a class='u'
+name="delete_segment"
+>delete_segment</a></h3>
+
+<pre>$data_writer-&#62;delete_segment($reader);</pre>
+
+<p>Remove a segment&#8217;s data.
+The default implementation is a no-op,
+as all files within the segment directory will be automatically deleted.
+Subclasses which manage their own files outside of the segment system should 
override this method and use it as a trigger for cleaning up obsolete data.</p>
+
+<ul>
+<li><b>reader</b> - The SegReader containing content to merge,
+which must represent a segment which is part of the the current snapshot.</li>
+</ul>
+
+<h3><a class='u'
+name="merge_segment"
+>merge_segment</a></h3>
+
+<pre>$data_writer-&#62;merge_segment(
+    reader  =&#62; $reader   # required
+    doc_map =&#62; $doc_map  # default: undef
+);</pre>
+
+<p>Move content from an existing segment into the one currently being 
written.</p>
+
+<p>The default implementation calls <a href="#add_segment" class="podlinkpod"
+>add_segment()</a> then <a href="#delete_segment" class="podlinkpod"
+>delete_segment()</a>.</p>
+
+<ul>
+<li><b>reader</b> - The SegReader containing content to merge,
+which must represent a segment which is part of the the current snapshot.</li>
+
+<li><b>doc_map</b> - An array of integers mapping old document ids to new.
+Deleted documents are mapped to 0,
+indicating that they should be skipped.</li>
+</ul>
+
+<h3><a class='u'
+name="metadata"
+>metadata</a></h3>
+
+<pre>my $hashref = $data_writer-&#62;metadata();</pre>
+
+<p>Arbitrary metadata to be serialized and stored by the Segment.
+The default implementation supplies a hash with a single key-value pair for 
&#8220;format&#8221;.</p>
+
+<h3><a class='u'
+name="get_snapshot"
+>get_snapshot</a></h3>
+
+<pre>my $snapshot = $data_writer-&#62;get_snapshot();</pre>
+
+<p>Accessor for &#8220;snapshot&#8221; member var.</p>
+
+<h3><a class='u'
+name="get_segment"
+>get_segment</a></h3>
+
+<pre>my $segment = $data_writer-&#62;get_segment();</pre>
+
+<p>Accessor for &#8220;segment&#8221; member var.</p>
+
+<h3><a class='u'
+name="get_polyreader"
+>get_polyreader</a></h3>
+
+<pre>my $poly_reader = $data_writer-&#62;get_polyreader();</pre>
+
+<p>Accessor for &#8220;polyreader&#8221; member var.</p>
+
+<h3><a class='u'
+name="get_schema"
+>get_schema</a></h3>
+
+<pre>my $schema = $data_writer-&#62;get_schema();</pre>
+
+<p>Accessor for &#8220;schema&#8221; member var.</p>
+
+<h3><a class='u'
+name="get_folder"
+>get_folder</a></h3>
+
+<pre>my $folder = $data_writer-&#62;get_folder();</pre>
+
+<p>Accessor for &#8220;folder&#8221; member var.</p>
+
+<h2><a class='u'
+name="INHERITANCE"
+>INHERITANCE</a></h2>
+
+<p>Lucy::Index::DataWriter isa Clownfish::Obj.</p>
+
+</div>

Added: lucy/site/trunk/content/docs/perl/Lucy/Index/DeletionsWriter.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Index/DeletionsWriter.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Index/DeletionsWriter.mdtext (added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Index/DeletionsWriter.mdtext Mon Apr 
 4 09:22:30 2016
@@ -0,0 +1,102 @@
+Title: Lucy::Index::DeletionsWriter – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Index::DeletionsWriter - Abstract base class for marking documents as 
deleted.</p>
+
+<h2><a class='u'
+name="SYNOPSIS"
+>SYNOPSIS</a></h2>
+
+<pre>my $polyreader  = $del_writer-&#62;get_polyreader;
+my $seg_readers = $polyreader-&#62;seg_readers;
+for my $seg_reader (@$seg_readers) {
+    my $count = $del_writer-&#62;seg_del_count( $seg_reader-&#62;get_seg_name 
);
+    ...
+}</pre>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>Subclasses of DeletionsWriter provide a low-level mechanism for declaring a 
document deleted from an index.</p>
+
+<p>Because files in an index are never modified,
+and because it is not practical to delete entire segments,
+a DeletionsWriter does not actually remove documents from the index.
+Instead,
+it communicates to a search-time companion DeletionsReader which documents are 
deleted in such a way that it can create a Matcher iterator.</p>
+
+<p>Documents are truly deleted only when the segments which contain them are 
merged into new ones.</p>
+
+<h2><a class='u'
+name="ABSTRACT_METHODS"
+>ABSTRACT METHODS</a></h2>
+
+<h3><a class='u'
+name="delete_by_term"
+>delete_by_term</a></h3>
+
+<pre>$deletions_writer-&#62;delete_by_term(
+    field =&#62; $field  # required
+    term  =&#62; $term   # required
+);</pre>
+
+<p>Delete all documents in the index that index the supplied term.</p>
+
+<ul>
+<li><b>field</b> - The name of an indexed field.
+(If it is not spec&#8217;d as <code>indexed</code>,
+an error will occur.)</li>
+
+<li><b>term</b> - The term which identifies docs to be marked as deleted.
+If <code>field</code> is associated with an Analyzer,
+<code>term</code> will be processed automatically (so don&#8217;t pre-process 
it yourself).</li>
+</ul>
+
+<h3><a class='u'
+name="delete_by_query"
+>delete_by_query</a></h3>
+
+<pre>$deletions_writer-&#62;delete_by_query($query);</pre>
+
+<p>Delete all documents in the index that match <code>query</code>.</p>
+
+<ul>
+<li><b>query</b> - A <a href="../../Lucy/Search/Query.html" class="podlinkpod"
+>Query</a>.</li>
+</ul>
+
+<h3><a class='u'
+name="updated"
+>updated</a></h3>
+
+<pre>my $bool = $deletions_writer-&#62;updated();</pre>
+
+<p>Returns true if there are updates that need to be written.</p>
+
+<h3><a class='u'
+name="seg_del_count"
+>seg_del_count</a></h3>
+
+<pre>my $int = $deletions_writer-&#62;seg_del_count($seg_name);</pre>
+
+<p>Return the number of deletions for a given segment.</p>
+
+<ul>
+<li><b>seg_name</b> - The name of the segment.</li>
+</ul>
+
+<h2><a class='u'
+name="INHERITANCE"
+>INHERITANCE</a></h2>
+
+<p>Lucy::Index::DeletionsWriter isa <a href="../../Lucy/Index/DataWriter.html" 
class="podlinkpod"
+>Lucy::Index::DataWriter</a> isa Clownfish::Obj.</p>
+
+</div>

Added: lucy/site/trunk/content/docs/perl/Lucy/Index/DocReader.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Index/DocReader.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Index/DocReader.mdtext (added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Index/DocReader.mdtext Mon Apr  4 
09:22:30 2016
@@ -0,0 +1,69 @@
+Title: Lucy::Index::DocReader – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Index::DocReader - Retrieve stored documents.</p>
+
+<h2><a class='u'
+name="SYNOPSIS"
+>SYNOPSIS</a></h2>
+
+<pre>my $doc_reader = 
$seg_reader-&#62;obtain(&#34;Lucy::Index::DocReader&#34;);
+my $doc        = $doc_reader-&#62;fetch_doc($doc_id);</pre>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>DocReader defines the interface by which documents (with all stored fields) 
are retrieved from the index.
+The default implementation returns <a href="../../Lucy/Document/HitDoc.html" 
class="podlinkpod"
+>HitDoc</a> objects.</p>
+
+<h2><a class='u'
+name="ABSTRACT_METHODS"
+>ABSTRACT METHODS</a></h2>
+
+<h3><a class='u'
+name="fetch_doc"
+>fetch_doc</a></h3>
+
+<pre>my $hit_doc = $doc_reader-&#62;fetch_doc($doc_id);</pre>
+
+<p>Retrieve the document identified by <code>doc_id</code>.</p>
+
+<p>Returns: a HitDoc.</p>
+
+<h2><a class='u'
+name="METHODS"
+>METHODS</a></h2>
+
+<h3><a class='u'
+name="aggregator"
+>aggregator</a></h3>
+
+<pre>my $result = $doc_reader-&#62;aggregator(
+    readers =&#62; $readers  # required
+    offsets =&#62; $offsets  # required
+);</pre>
+
+<p>Returns a DocReader which divvies up requests to its sub-readers according 
to the offset range.</p>
+
+<ul>
+<li><b>readers</b> - An array of DocReaders.</li>
+
+<li><b>offsets</b> - Doc id start offsets for each reader.</li>
+</ul>
+
+<h2><a class='u'
+name="INHERITANCE"
+>INHERITANCE</a></h2>
+
+<p>Lucy::Index::DocReader isa <a href="../../Lucy/Index/DataReader.html" 
class="podlinkpod"
+>Lucy::Index::DataReader</a> isa Clownfish::Obj.</p>
+
+</div>

Added: lucy/site/trunk/content/docs/perl/Lucy/Index/IndexManager.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Index/IndexManager.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Index/IndexManager.mdtext (added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Index/IndexManager.mdtext Mon Apr  4 
09:22:30 2016
@@ -0,0 +1,173 @@
+Title: Lucy::Index::IndexManager – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Index::IndexManager - Policies governing index updating,
+locking,
+and file deletion.</p>
+
+<h2><a class='u'
+name="SYNOPSIS"
+>SYNOPSIS</a></h2>
+
+<pre>use Sys::Hostname qw( hostname );
+my $hostname = hostname() or die &#34;Can&#39;t get unique hostname&#34;;
+my $manager = Lucy::Index::IndexManager-&#62;new( 
+    host =&#62; $hostname,
+);
+
+# Index time:
+my $indexer = Lucy::Index::Indexer-&#62;new(
+    index =&#62; &#39;/path/to/index&#39;,
+    manager =&#62; $manager,
+);
+
+# Search time:
+my $reader = Lucy::Index::IndexReader-&#62;open(
+    index   =&#62; &#39;/path/to/index&#39;,
+    manager =&#62; $manager,
+);
+my $searcher = Lucy::Search::IndexSearcher-&#62;new( index =&#62; $reader 
);</pre>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>IndexManager is an advanced-use class for controlling index locking,
+updating,
+merging,
+and deletion behaviors.</p>
+
+<p>IndexManager and <a href="../../Lucy/Plan/Architecture.html" 
class="podlinkpod"
+>Architecture</a> are complementary classes: Architecture is used to define 
traits and behaviors which cannot change for the life of an index; IndexManager 
is used for defining rules which may change from process to process.</p>
+
+<h2><a class='u'
+name="CONSTRUCTORS"
+>CONSTRUCTORS</a></h2>
+
+<h3><a class='u'
+name="new"
+>new</a></h3>
+
+<pre>my $manager = Lucy::Index::IndexManager-&#62;new(
+    host =&#62; $hostname,    # default: &#34;&#34;
+);</pre>
+
+<p>Create a new IndexManager.</p>
+
+<ul>
+<li><b>host</b> - An identifier which should be unique per-machine.</li>
+
+<li><b>lock_factory</b> - A LockFactory.</li>
+</ul>
+
+<h2><a class='u'
+name="METHODS"
+>METHODS</a></h2>
+
+<h3><a class='u'
+name="set_folder"
+>set_folder</a></h3>
+
+<pre>$index_manager-&#62;set_folder($folder);
+$index_manager-&#62;set_folder();  # default: undef</pre>
+
+<p>Setter for <code>folder</code> member.
+Typical clients (Indexer,
+IndexReader) will use this method to install their own Folder instance.</p>
+
+<h3><a class='u'
+name="get_folder"
+>get_folder</a></h3>
+
+<pre>my $folder = $index_manager-&#62;get_folder();</pre>
+
+<p>Getter for <code>folder</code> member.</p>
+
+<h3><a class='u'
+name="get_host"
+>get_host</a></h3>
+
+<pre>my $string = $index_manager-&#62;get_host();</pre>
+
+<p>Getter for <code>host</code> member.</p>
+
+<h3><a class='u'
+name="recycle"
+>recycle</a></h3>
+
+<pre>my $arrayref = $index_manager-&#62;recycle(
+    reader     =&#62; $reader      # required
+    del_writer =&#62; $del_writer  # required
+    cutoff     =&#62; $cutoff      # required
+    optimize   =&#62; $optimize    # default: false
+);</pre>
+
+<p>Return an array of SegReaders representing segments that should be 
consolidated.
+Implementations must balance index-time churn against search-time degradation 
due to segment proliferation.
+The default implementation prefers small segments or segments with a high 
proportion of deletions.</p>
+
+<ul>
+<li><b>reader</b> - A PolyReader.</li>
+
+<li><b>del_writer</b> - A DeletionsWriter.</li>
+
+<li><b>cutoff</b> - A segment number which all returned SegReaders must 
exceed.</li>
+
+<li><b>optimize</b> - A boolean indicating whether to spend extra time 
optimizing the index for search-time performance.</li>
+</ul>
+
+<h3><a class='u'
+name="make_write_lock"
+>make_write_lock</a></h3>
+
+<pre>my $lock = $index_manager-&#62;make_write_lock();</pre>
+
+<p>Create the Lock which controls access to modifying the logical content of 
the index.</p>
+
+<h3><a class='u'
+name="set_write_lock_timeout"
+>set_write_lock_timeout</a></h3>
+
+<pre>$index_manager-&#62;set_write_lock_timeout($timeout);</pre>
+
+<p>Setter for write lock timeout.
+Default: 1000 milliseconds.</p>
+
+<h3><a class='u'
+name="get_write_lock_timeout"
+>get_write_lock_timeout</a></h3>
+
+<pre>my $int = $index_manager-&#62;get_write_lock_timeout();</pre>
+
+<p>Getter for write lock timeout.</p>
+
+<h3><a class='u'
+name="set_write_lock_interval"
+>set_write_lock_interval</a></h3>
+
+<pre>$index_manager-&#62;set_write_lock_interval($timeout);</pre>
+
+<p>Setter for write lock retry interval.
+Default: 100 milliseconds.</p>
+
+<h3><a class='u'
+name="get_write_lock_interval"
+>get_write_lock_interval</a></h3>
+
+<pre>my $int = $index_manager-&#62;get_write_lock_interval();</pre>
+
+<p>Getter for write lock retry interval.</p>
+
+<h2><a class='u'
+name="INHERITANCE"
+>INHERITANCE</a></h2>
+
+<p>Lucy::Index::IndexManager isa Clownfish::Obj.</p>
+
+</div>

Added: lucy/site/trunk/content/docs/perl/Lucy/Index/IndexReader.mdtext
URL: 
http://svn.apache.org/viewvc/lucy/site/trunk/content/docs/perl/Lucy/Index/IndexReader.mdtext?rev=1737642&view=auto
==============================================================================
--- lucy/site/trunk/content/docs/perl/Lucy/Index/IndexReader.mdtext (added)
+++ lucy/site/trunk/content/docs/perl/Lucy/Index/IndexReader.mdtext Mon Apr  4 
09:22:30 2016
@@ -0,0 +1,164 @@
+Title: Lucy::Index::IndexReader – Apache Lucy Documentation
+
+<div>
+<a name='___top' class='dummyTopAnchor' ></a>
+
+<h2><a class='u'
+name="NAME"
+>NAME</a></h2>
+
+<p>Lucy::Index::IndexReader - Read from an inverted index.</p>
+
+<h2><a class='u'
+name="SYNOPSIS"
+>SYNOPSIS</a></h2>
+
+<pre>my $reader = Lucy::Index::IndexReader-&#62;open(
+    index =&#62; &#39;/path/to/index&#39;,
+);
+my $seg_readers = $reader-&#62;seg_readers;
+for my $seg_reader (@$seg_readers) {
+    my $seg_name = $seg_reader-&#62;get_segment-&#62;get_name;
+    my $num_docs = $seg_reader-&#62;doc_max;
+    print &#34;Segment $seg_name ($num_docs documents):\n&#34;;
+    my $doc_reader = $seg_reader-&#62;obtain(&#34;Lucy::Index::DocReader&#34;);
+    for my $doc_id ( 1 .. $num_docs ) {
+        my $doc = $doc_reader-&#62;fetch_doc($doc_id);
+        print &#34;  $doc_id: $doc-&#62;{title}\n&#34;;
+    }
+}</pre>
+
+<h2><a class='u'
+name="DESCRIPTION"
+>DESCRIPTION</a></h2>
+
+<p>IndexReader is the interface through which <a 
href="../../Lucy/Search/IndexSearcher.html" class="podlinkpod"
+>IndexSearcher</a> objects access the content of an index.</p>
+
+<p>IndexReader objects always represent a point-in-time view of an index as it 
existed at the moment the reader was created.
+If you want search results to reflect modifications to an index,
+you must create a new IndexReader after the update process completes.</p>
+
+<p>IndexReaders are composites; most of the work is done by individual <a 
href="../../Lucy/Index/DataReader.html" class="podlinkpod"
+>DataReader</a> sub-components,
+which may be accessed via <a href="#fetch" class="podlinkpod"
+>fetch()</a> and <a href="#obtain" class="podlinkpod"
+>obtain()</a>.
+The most efficient and powerful access to index data happens at the segment 
level via <a href="../../Lucy/Index/SegReader.html" class="podlinkpod"
+>SegReader</a>&#8217;s sub-components.</p>
+
+<h2><a class='u'
+name="CONSTRUCTORS"
+>CONSTRUCTORS</a></h2>
+
+<h3><a class='u'
+name="open"
+>open</a></h3>
+
+<pre>my $reader = Lucy::Index::IndexReader-&#62;open(
+    index    =&#62; &#39;/path/to/index&#39;, # required
+    snapshot =&#62; $snapshot,
+    manager  =&#62; $index_manager,
+);</pre>
+
+<p>IndexReader is an abstract base class; open() returns the IndexReader 
subclass PolyReader,
+which channels the output of 0 or more SegReaders.</p>
+
+<ul>
+<li><b>index</b> - Either a string filepath or a Folder.</li>
+
+<li><b>snapshot</b> - A Snapshot.
+If not supplied,
+the most recent snapshot file will be used.</li>
+
+<li><b>manager</b> - An <a href="../../Lucy/Index/IndexManager.html" 
class="podlinkpod"
+>IndexManager</a>.
+Read-locking is off by default; supplying this argument turns it on.</li>
+</ul>
+
+<h2><a class='u'
+name="ABSTRACT_METHODS"
+>ABSTRACT METHODS</a></h2>
+
+<h3><a class='u'
+name="doc_max"
+>doc_max</a></h3>
+
+<pre>my $int = $index_reader-&#62;doc_max();</pre>
+
+<p>Return the maximum number of documents available to the reader,
+which is also the highest possible internal document id.
+Documents which have been marked as deleted but not yet purged from the index 
are included in this count.</p>
+
+<h3><a class='u'
+name="doc_count"
+>doc_count</a></h3>
+
+<pre>my $int = $index_reader-&#62;doc_count();</pre>
+
+<p>Return the number of documents available to the reader,
+subtracting any that are marked as deleted.</p>
+
+<h3><a class='u'
+name="del_count"
+>del_count</a></h3>
+
+<pre>my $int = $index_reader-&#62;del_count();</pre>
+
+<p>Return the number of documents which have been marked as deleted but not 
yet purged from the index.</p>
+
+<h3><a class='u'
+name="offsets"
+>offsets</a></h3>
+
+<pre>my $i32_array = $index_reader-&#62;offsets();</pre>
+
+<p>Return an array with one entry for each segment,
+corresponding to segment doc_id start offset.</p>
+
+<h3><a class='u'
+name="seg_readers"
+>seg_readers</a></h3>
+
+<pre>my $arrayref = $index_reader-&#62;seg_readers();</pre>
+
+<p>Return an array of all the SegReaders represented within the 
IndexReader.</p>
+
+<h2><a class='u'
+name="METHODS"
+>METHODS</a></h2>
+
+<h3><a class='u'
+name="obtain"
+>obtain</a></h3>
+
+<pre>my $data_reader = $index_reader-&#62;obtain($api);</pre>
+
+<p>Fetch a component,
+or throw an error if the component can&#8217;t be found.</p>
+
+<ul>
+<li><b>api</b> - The name of the DataReader subclass that the desired 
component must implement.</li>
+</ul>
+
+<h3><a class='u'
+name="fetch"
+>fetch</a></h3>
+
+<pre>my $data_reader = $index_reader-&#62;fetch($api);</pre>
+
+<p>Fetch a component,
+or return undef if the component can&#8217;t be found.</p>
+
+<ul>
+<li><b>api</b> - The name of the DataReader subclass that the desired 
component must implement.</li>
+</ul>
+
+<h2><a class='u'
+name="INHERITANCE"
+>INHERITANCE</a></h2>
+
+<p>Lucy::Index::IndexReader isa <a href="../../Lucy/Index/DataReader.html" 
class="podlinkpod"
+>Lucy::Index::DataReader</a> isa Clownfish::Obj.</p>
+
+</div>



Reply via email to