couchdb external process to search using KinoSearch
authorDobrica Pavlinusic <dpavlin@rot13.org>
Tue, 7 Dec 2010 15:15:21 +0000 (16:15 +0100)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Tue, 7 Dec 2010 15:15:21 +0000 (16:15 +0100)
couchdb-external-kinosearch.pl [new file with mode: 0755]

diff --git a/couchdb-external-kinosearch.pl b/couchdb-external-kinosearch.pl
new file mode 100755 (executable)
index 0000000..99e6dcc
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+
+# http://wiki.apache.org/couchdb/ExternalProcesses
+
+use KinoSearch::Search::IndexSearcher;
+use JSON;
+use Data::Dump qw(dump);
+
+$|=1;
+
+my $searcher = KinoSearch::Search::IndexSearcher->new( 
+       index => '/tmp/index' 
+);
+
+open(my $log, '>>', '/tmp/couchdb-external-kinosearch.log');
+
+while(<STDIN>) {
+       warn "# $_\n";
+       my $request = decode_json($_);
+       print $log "<<< $_\n"; 
+
+       my $response = {
+               code => 200,
+#              json => {},
+       };
+
+       if ( my $q = $request->{query}->{q} ) {
+
+               my $hits = $searcher->hits( query => $q );
+
+               $response->{json}->{total_hits} = $hits->total_hits;
+
+               while ( my $hit = $hits->next ) {
+                       push @{ $response->{json}->{hits} }, {
+                               _id => $hit->{_id},
+                               _rev => $hit->{_rev},
+                               score => $hit->get_score,
+                       };
+               }
+
+       } else {
+               $response->{json}->{error} = "no query found";
+       }
+
+       my $json = encode_json($response);
+       print $json, $/;
+       print $log ">>> $json\n";
+}
+