;;; guile-xapian --- Guile bindings for Xapian ;;; Copyright © 2020, 2021 Arun Isaac ;;; ;;; This file is part of guile-xapian. ;;; ;;; guile-xapian is free software: you can redistribute it and/or ;;; modify it under the terms of the GNU General Public License as ;;; published by the Free Software Foundation, either version 2 of the ;;; License, or (at your option) any later version. ;;; ;;; guile-xapian is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;; General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with guile-xapian. If not, see ;;; . (use-modules (ice-9 format) (ice-9 match) (xapian xapian)) (define (get-title record) (match record ((description title identifier) title))) (define* (search dbpath querystring #:key (pagesize 10)) ;; Open database for reading. call-with-database automatically ;; closes the database once we're done. (call-with-database dbpath (lambda (db) (let (;; Parse querystring passing a stemmer and suitable ;; prefixes for field search. (query (parse-query querystring #:stemmer (make-stem "en") #:prefixes '(("title" . "S") ("description" . "XD"))))) ;; Fold over the results, printing them. (mset-fold (lambda (item _) (format #t "~a: #~3,'0d ~a~%" (mset-item-rank item) (mset-item-docid item) (get-title (call-with-input-string (document-data (mset-item-document item)) read)))) #f ;; Get an Enquire object from the database with the ;; search results. Then, extract the MSet from the ;; Enquire object. (enquire-mset (enquire db query) #:maximum-items pagesize)))))) ;; Handle command line arguments (match (command-line) ((_ dbpath . query-terms) (search dbpath (string-join query-terms))) ((program . _) (format (current-error-port) "Usage: ~a DBPATH QUERYTERM...~%" program)))