Changeset 2111

Show
Ignore:
Timestamp:
04/06/08 23:29:45 (1 month ago)
Author:
karpet
Message:

xapian example can now search as well as index

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libswish3/trunk/src/xapian/swish_xapian.cpp

    r2108 r2111  
    6767    char *dbpath 
    6868); 
    69 int do_search( 
     69int search( 
    7070    char *query 
    7171); 
     
    7575static Xapian::WritableDatabase     wdb; 
    7676static Xapian::Database::Database   rdb; 
    77 static Xapian::Stem stemmer("english"); 
     77static Xapian::Stem stemmer("english"); // TODO make this configurable 
    7878static Xapian::TermGenerator        indexer; 
    7979static int                          twords = 0; 
     
    216216        (swish_MetaName *)swish_hash_fetch(config->metanames, metaname); 
    217217    prefix = int_to_string(meta->id); 
    218     return prefix; 
     218    return prefix + string((const char*)":"); 
     219
     220 
     221static void 
     222add_prefix( 
     223    swish_MetaName      *meta, 
     224    Xapian::QueryParser qp, 
     225    xmlChar             *name 
     226
     227
     228    qp.add_prefix(string((const char*)name),  
     229                         int_to_string(meta->id) + string((const char*)":")); 
    219230} 
    220231 
     
    449460 
    450461int 
    451 do_search( 
    452     char *query 
    453 
    454 
    455  
     462search( 
     463    char *qstr 
     464
     465
     466    int total_matches; 
     467    Xapian::Enquire    *enquire; 
     468    Xapian::Query       query; 
     469    Xapian::QueryParser qparser; 
     470    Xapian::MSet        mset; 
     471    Xapian::MSetIterator iterator; 
     472    Xapian::Document    doc; 
     473     
     474    total_matches = 0; 
     475    qparser.set_stemmer(stemmer);    // TODO make this configurable 
     476    qparser.set_database(rdb); 
     477     
     478    // map all human metanames to internal prefix 
     479    xmlHashScan(s3->config->metanames, (xmlHashScanner)add_prefix, &qparser); 
     480     
     481    // TODO boolean_prefix? 
     482         
     483    try { 
     484        query = qparser.parse_query(string(qstr)); 
     485    } 
     486    catch (Xapian::QueryParserError &e) { 
     487        SWISH_CROAK("query parser error: %s", e.get_msg().c_str()); 
     488    } 
     489     
     490    enquire = new Xapian::Enquire(rdb); 
     491    enquire->set_query(query); 
     492    mset = enquire->get_mset(0, 100); 
     493    iterator = mset.begin(); 
     494    for ( ; iterator != mset.end(); ++iterator) { 
     495        doc = iterator.get_document(); 
     496        printf("ID %d %d%%\n[\n%s\n]\n",  
     497                iterator.operator*(), iterator.get_percent(), doc.get_data().c_str()); 
     498        total_matches++; 
     499    } 
     500    printf("%d total matches\n", total_matches); 
    456501} 
    457502 
     
    535580        case 'q': 
    536581            query = (char *)swish_xstrdup((xmlChar *)optarg); 
     582            break; 
    537583 
    538584        case '?': 
     
    554600       die with no args  
    555601     */ 
    556     if (!i || i >= argc) { 
     602    if ((!i || i >= argc) && !query) { 
    557603        swish_free_swish3(s3); 
    558604        usage(); 
     
    568614    } 
    569615 
     616    // indexing mode 
    570617    if (!query) { 
    571         // indexing mode 
     618         
    572619        open_writeable_index(dbpath); 
    573620     
     
    604651    else { 
    605652        open_readable_index(dbpath); 
    606         do_search(query); 
     653        search(query); 
     654        swish_xfree(BAD_CAST query); 
    607655    } 
    608656 
  • libswish3/trunk/src/xapian/test.pl

    r2090 r2111  
    22 
    33use Carp; 
    4 use Test::More tests => 3
     4use Test::More tests => 4
    55 
    6 ok( run(''),                    'usage' ); 
     6ok( run(''), 'usage' ); 
     7 
     8# indexing 
    79ok( run(' ../test_docs/*xml'),  'index xml' ); 
    810ok( run(' ../test_docs/*html'), 'index html' ); 
     11 
     12# searching 
     13ok( ( grep {m/2 total matches/} run(' --query swishtitle:foobar') ), 
     14    'search swishtitle:foobar' ); 
    915 
    1016sub run {