Changeset 2533


Ignore:
Timestamp:
02/22/10 23:26:43 (2 years ago)
Author:
karpet
Message:

facet support; release 0.02

Location:
Search-OpenSearch-Engine-KSx/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • Search-OpenSearch-Engine-KSx/trunk/Changes

    r2465 r2533  
    44        First version, released on an unsuspecting world. 
    55 
     60.02    22 Feb 2010 
     7    * add Facet support 
     8 
  • Search-OpenSearch-Engine-KSx/trunk/Makefile.PL

    r2458 r2533  
    1414    PREREQ_PM => { 
    1515        'Test::More'         => 0, 
    16         'Search::OpenSearch' => 0, 
    17         'SWISH::Prog::KSx'   => 0.06, 
     16        'Search::OpenSearch' => 0.05, 
     17        'SWISH::Prog::KSx'   => 0.08, 
    1818    }, 
    1919    dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, 
  • Search-OpenSearch-Engine-KSx/trunk/lib/Search/OpenSearch/Engine/KSx.pm

    r2458 r2533  
    55use base qw( Search::OpenSearch::Engine ); 
    66use SWISH::Prog::KSx::Searcher; 
     7use KinoSearch::Object::BitVector; 
     8use KinoSearch::Search::HitCollector::BitCollector; 
    79 
    8 our $VERSION = '0.01'; 
     10our $VERSION = '0.02'; 
    911 
    1012sub init_searcher { 
     
    1315    my $searcher = SWISH::Prog::KSx::Searcher->new( invindex => $index ); 
    1416    return $searcher; 
     17} 
     18 
     19sub build_facets { 
     20    my $self     = shift; 
     21    my $query    = shift or croak "query required"; 
     22    my $results  = shift or croak "results required"; 
     23    my $facetobj = $self->facets or return; 
     24 
     25    my @facet_names  = @{ $facetobj->names }; 
     26    my $sample_size  = $facetobj->sample_size; 
     27    my $searcher     = $self->searcher; 
     28    my $ks_searcher  = $searcher->{ks}; 
     29    my $query_parser = $searcher->{qp}; 
     30    my $bit_vec      = KinoSearch::Object::BitVector->new( 
     31        capacity => $ks_searcher->doc_max + 1 ); 
     32    my $collector = KinoSearch::Search::HitCollector::BitCollector->new( 
     33        bit_vector => $bit_vec, ); 
     34 
     35    $ks_searcher->collect( 
     36        query     => $query_parser->parse("$query"), 
     37        collector => $collector 
     38    ); 
     39 
     40    # find the facets 
     41    my %facets; 
     42    my $doc_id = 0; 
     43    my $count  = 0; 
     44    while (1) { 
     45        $doc_id = $bit_vec->next_set_bit( $doc_id + 1 ); 
     46        last if $doc_id == -1; 
     47        last if $sample_size and ++$count > $sample_size; 
     48        my $doc = $ks_searcher->fetch_doc( doc_id => $doc_id ); 
     49        for my $name (@facet_names) { 
     50 
     51            # unique-ify 
     52            my %val = map { $_ => $_ } 
     53                split( m/\003/, $doc->{$name} ); 
     54            for my $value ( keys %val ) { 
     55                $facets{$name}->{$value}++; 
     56            } 
     57        } 
     58    } 
     59 
     60    # turn the struct inside out a bit, esp for XML 
     61    my %facet_struct; 
     62    for my $f ( keys %facets ) { 
     63        for my $n ( keys %{ $facets{$f} } ) { 
     64            push @{ $facet_struct{$f} }, 
     65                { term => $n, count => $facets{$f}->{$n} }; 
     66        } 
     67    } 
     68    return \%facet_struct; 
    1569} 
    1670 
     
    3084 
    3185Returns a SWISH::Prog::KSx::Searcher object. 
     86 
     87=head2 build_facets( I<query>, I<results> ) 
     88 
     89Returns hash ref of facets from I<results>. See Search::OpenSearch::Engine. 
    3290 
    3391=head1 AUTHOR 
Note: See TracChangeset for help on using the changeset viewer.