Function: nnir-run-swish-e
nnir-run-swish-e is a byte-compiled function defined in nnir.el.gz.
Signature
(nnir-run-swish-e QUERY SERVER &optional GROUP)
Documentation
Run given QUERY on SERVER against swish-e.
Returns a vector of (group name, file name) pairs (also vectors, actually).
Tested with swish-e-2.0.1 on Windows NT 4.0.
Source Code
;; Defined in /usr/src/emacs/lisp/obsolete/nnir.el.gz
;; Swish-E interface.
(defun nnir-run-swish-e (query server &optional _group)
"Run given QUERY on SERVER against swish-e.
Returns a vector of (group name, file name) pairs (also vectors,
actually).
Tested with swish-e-2.0.1 on Windows NT 4.0."
;; swish-e crashes with empty parameter to "-w" on commandline...
;; (when group
;; (error "The swish-e backend cannot search specific groups"))
(save-excursion
(let ((qstring (cdr (assq 'query query)))
(prefix
(or (nnir-read-server-parm 'nnir-swish-e-remove-prefix server)
(error "Missing parameter `nnir-swish-e-remove-prefix'")))
artlist score artno dirnam group )
(when (equal "" qstring)
(error "swish-e: You didn't enter anything"))
(set-buffer (gnus-get-buffer-create nnir-tmp-buffer))
(erase-buffer)
(message "Doing swish-e query %s..." query)
(let* ((index-files
(or (nnir-read-server-parm
'nnir-swish-e-index-files server)
(error "Missing parameter `nnir-swish-e-index-files'")))
(additional-switches
(nnir-read-server-parm
'nnir-swish-e-additional-switches server))
(cp-list `(,nnir-swish-e-program
nil ; input from /dev/null
t ; output
nil ; don't redisplay
"-f" ,@index-files
,@additional-switches
"-w"
,qstring ; the query, in swish-e format
))
(exitstatus
(progn
(message "%s args: %s" nnir-swish-e-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-e: %s" exitstatus)
;; swish-e 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:
;; rank path-name file-title file-size
(goto-char (point-min))
(while (re-search-forward
"\\(^[0-9]+\\) \\([^ ]+\\) \"\\([^\"]+\\)\" [0-9]+$" nil t)
(setq score (match-string 1)
artno (match-string 3)
dirnam (file-name-directory (match-string 2)))
;; don't match directories
(when (string-match "^[0-9]+$" artno)
(when (not (null dirnam))
;; remove nnir-swish-e-remove-prefix from beginning of dirname
(when (string-match (concat "^" prefix) dirnam)
(setq dirnam (replace-match "" t t dirnam)))
(setq dirnam (substring dirnam 0 -1))
;; eliminate all ".", "/", "\" from beginning. Always matches.
(string-match "^[./\\]*\\(.*\\)$" dirnam)
;; "/" -> "."
(setq group (string-replace
"/" "." (match-string 1 dirnam)))
;; Windows "\\" -> "."
(setq group (string-replace "\\" "." group))
(push (vector (gnus-group-full-name group server)
(string-to-number artno)
(string-to-number score))
artlist))))
(message "Massaging swish-e output...done")
;; Sort by score
(apply #'vector
(sort artlist
(lambda (x y)
(> (nnir-artitem-rsv x)
(nnir-artitem-rsv y))))))))