summaryrefslogtreecommitdiff
path: root/examples/search.scm
blob: eef075f75c711799ce71c83fe591723a4c9ab63b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
;;; guile-xapian --- Guile bindings for Xapian
;;; Copyright © 2020, 2021 Arun Isaac <arunisaac@systemreboot.net>
;;;
;;; 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
;;; <https://www.gnu.org/licenses/>.

(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)))