Note on i:  Solr replication provides pretty good clustering support 
out-of-the-box, including replication of multiple cores.  Read the Wiki on 
replication (Google +solr +replication if you don't know where it is).  

In my experience, the problem with indexing PDFs is it takes a lot of CPU on 
the document parsing side (client), not on the Solr server side.  So make sure 
you do that part on the client and not the server.

Avoiding iii:


Suggest that you write yourself a multi-threaded performance test so that you 
aren't guessing what your performance will be.

We wrote one in Perl.  It handles an individual thread (we were testing 
inquiry), and we wrote a little batch file / shell script to start up the 
desired number of threads.

The main statement in our batch file (the rest just set the variables).  A  
Shell script would be even easier.

for /L %%i in (1,1,%THREADS%) DO start /B perl solrtest.pl -h %SOLRHOST% 
-c %COUNT% -u %1 -p %2 -r %SOLRREALM% -f %SOLRLOC%\firstsynonyms.txt -l 
%SOLRLOC%\lastsynonyms.txt -z %FUZZ%

The perl


#!/usr/bin/perl

#
#       Perl program to run a thread of solr testing
#

use Getopt::Std;                        # For options processing
use POSIX;                              # For time formatting
use XML::Simple;                        # For processing of XML config file
use Data::Dumper;                       # For debugging XML config file
use HTTP::Request::Common;              # For HTTP request to Solr
use HTTP::Response;
use LWP::UserAgent;                     # For HTTP request to Solr

$host = "YOURHOST:8983";
$realm = "YOUR AUTHENTICATION REALM";
$firstlist = "firstsynonyms.txt";
$lastlist = "lastsynonyms.txt";
$fuzzy = "";

$me = $0;

sub usage() {
        print "perl $me -c iterations [-d] [-h host:port ] [-u user [-p 
password]] \n";
        print "\t\t[-f firstnamefile] [-l lastnamefile] [-z fuzzy] [-r 
realm]\n";
        exit(8);
}


#
#       Process the command line options, and open the output file.
#

getopts('dc:u:p:f:l:h:r:z:') || usage();

if(!$opt_c) {
        usage();
}

$count = $opt_c;

if($opt_u) {
        $user = $opt_u;
}

if($opt_p) {
        $password = $opt_p;
}

if($opt_h) {
        $host = $opt_h;
}

if($opt_f) {
        $firstlist = $opt_f;
}

if($opt_l) {
        $lastlist = $opt_l;
}

if($opt_r) {
        $realm = $opt_r;
}

if($opt_z) {
        $fuzzy = "~" . $opt_z;
}

$debug = $opt_d;


#
#       If the host string does not include a :, add :80
#

if($host !~ /:/) {
        $host = $host . ":80";
}

#
#       Read the lists of first and last names
#

open(SYNFILE,"<$firstlist") || die "Can't open first name list $firstlist\n";
while(<SYNFILE>) {
        @newwords = split /,/;
        for($i=0; $i <= $#newwords; ++$i) {
                $newwords[$i] =~ s/^\s+//;
                $newwords[$i] =~ s/\s+$//;
                $newwords[$i] = lc($newwords[$i]);
        }
        push @firstnames, @newwords;
}
close(SYNFILE);

open(SYNFILE,"<$lastlist") || die "Can't open last name list $lastlist\n";
while(<SYNFILE>) {
        @newwords = split /,/;
        for($i=0; $i <= $#newwords; ++$i) {
                $newwords[$i] =~ s/^\s+//;
                $newwords[$i] =~ s/\s+$//;
                $newwords[$i] = lc($newwords[$i]);
        }
        push @lastnames, @newwords;
}
close(SYNFILE);


print "$#firstnames First Names, $#lastnames Last Names\n";
print "User: $user\n";


my $userAgent = LWP::UserAgent->new(agent => 'solrtest.pl');
$userAgent->credentials("$host",$realm,$user,$password);

$uri = "http://$host/solr/select";;

$starttime = time();

for($c=0; $c < $count; ++$c) {
        $fname = $firstnames[rand $#firstnames];
        $lname = $lastnames[rand $#lastnames];
        $response = $userAgent->request(
                POST $uri,
                [ 
                        q => "lnamesyn:$lname AND fnamesyn:$fname$fuzzy",
                        rows => "25"
                ]);

        if($debug) {
                print "Query: lnamesyn:$lname AND fnamesyn:$fname$fuzzy";
                print $response->content();
        }
        print "POST for $fname $lname completed, HTTP status=" . 
$response->code . "\n";
}

$elapsed = time() - $starttime;
$average = $elapsed / $count;

print "Time: $elapsed s ($average/request)\n";


-----Original Message-----
From: Rode Gonzalez (libnova) [mailto:r...@libnova.es] 
Sent: Saturday, August 13, 2011 3:50 AM
To: solr-user@lucene.apache.org
Subject: ideas for indexing large amount of pdf docs

Hi all,

I want to ask about the best way to implement a solution for indexing a 
large amount of pdf documents between 10-60 MB each one. 100 to 1000 users 
connected simultaneously.

I actually have 1 core of solr 3.3.0 and it works fine for a few number of 
pdf docs but I'm afraid about the moment when we enter in production time.

some possibilities:

i. clustering. I have no experience in this, so it will be a bad idea to 
venture into this.

ii. multicore solution. make some kind of hash to choose one core at each 
query (exact queries) and thus reduce the size of the individual indexes to 
consult or to consult all the cores at same time (complex queries).

iii. do nothing more and wait for the catastrophe in the response times :P


Someone with experience can help a bit to decide?

Thanks a lot in advance.

Reply via email to