Function: nnir-run-swish++
nnir-run-swish++ is a byte-compiled function defined in nnir.el.gz.
Signature
(nnir-run-swish++ QUERY SERVER &optional GROUP)
Documentation
Run QUERY on SERVER against swish++.
Returns a vector of (group name, file name) pairs (also vectors, actually).
Tested with swish++ 4.7 on GNU/Linux and with swish++ 5.0b2 on Windows NT 4.0.
Source Code
;; Defined in /usr/src/emacs/lisp/obsolete/nnir.el.gz
;; Swish++ interface.
;; -cc- Todo
;; Search by
;; - group
;; Sort by
;; - rank (default)
;; - article number
;; - file size
;; - group
(defun nnir-run-swish++ (query server &optional _group)
"Run QUERY on SERVER against swish++.
Returns a vector of (group name, file name) pairs (also vectors,
actually).
Tested with swish++ 4.7 on GNU/Linux and with swish++ 5.0b2 on
Windows NT 4.0."
;; (when group
;; (error "The swish++ backend cannot search specific groups"))
(save-excursion
(let ( (qstring (cdr (assq 'query query)))
(groupspec (cdr (assq 'swish++-group query)))
(prefix (nnir-read-server-parm 'nnir-swish++-remove-prefix server))
artlist
;; nnml-use-compressed-files might be any string, but probably this
;; is sufficient. Note that we can't only use the value of
;; nnml-use-compressed-files because old articles might have been
;; saved with a different value.
(article-pattern (if (string-match "\\`nnmaildir:"
(gnus-group-server server))
":[0-9]+"
"^[0-9]+\\(\\.[a-z0-9]+\\)?$"))
score artno dirnam filenam)
(when (equal "" qstring)
(error "swish++: You didn't enter anything"))
(set-buffer (gnus-get-buffer-create nnir-tmp-buffer))
(erase-buffer)
(if groupspec
(message "Doing swish++ query %s on %s..." qstring groupspec)
(message "Doing swish++ query %s..." qstring))
(let* ((cp-list `( ,nnir-swish++-program
nil ; input from /dev/null
t ; output
nil ; don't redisplay
"--config-file" ,(nnir-read-server-parm 'nnir-swish++-configuration-file server)
,@(nnir-read-server-parm 'nnir-swish++-additional-switches server)
,qstring ; the query, in swish++ format
))
(exitstatus
(progn
(message "%s args: %s" nnir-swish++-program
(mapconcat #'identity (nthcdr 4 cp-list) " ")) ;; ???
(apply #'call-process cp-list))))
(unless (or (null exitstatus)
(zerop exitstatus))
(nnheader-report 'nnir "Couldn't run swish++: %s" exitstatus)
;; swish++ failure reason is in this buffer, show it if
;; the user wants it.
(when (> gnus-verbose 6)
(display-buffer nnir-tmp-buffer))))
;; The results are output in the format of:
;; V 4.7 Linux
;; rank relative-path-name file-size file-title
;; V 5.0b2:
;; rank relative-path-name file-size topic??
;; where rank is an integer from 1 to 100.
(goto-char (point-min))
(while (re-search-forward
"\\(^[0-9]+\\) \\([^ ]+\\) [0-9]+ \\(.*\\)$" nil t)
(setq score (match-string 1)
filenam (match-string 2)
artno (file-name-nondirectory filenam)
dirnam (file-name-directory filenam))
;; don't match directories
(when (string-match article-pattern artno)
(when (not (null dirnam))
;; maybe limit results to matching groups.
(when (or (not groupspec)
(string-match groupspec dirnam))
(nnir-add-result dirnam artno score prefix server artlist)))))
(message "Massaging swish++ output...done")
;; Sort by score
(apply #'vector
(sort artlist
(lambda (x y)
(> (nnir-artitem-rsv x)
(nnir-artitem-rsv y))))))))