Added per bot instance index directory support. Added total search results count display.

master
Abhinav Sarkar 2011-06-06 14:18:28 +05:30
parent 3bf0253f69
commit 675480aa9c
2 changed files with 48 additions and 41 deletions

View File

@ -10,7 +10,7 @@
[clojure.java.io :only (reader as-file)] [clojure.java.io :only (reader as-file)]
[clojure.contrib.math :only (floor)])) [clojure.contrib.math :only (floor)]))
(def *index-dir* (fs-directory "index")) (defn index-dir [bot] (fs-directory (str "index-" (.getNick bot))))
(def *chat-log* (atom [])) (def *chat-log* (atom []))
@ -42,27 +42,29 @@
(let [qp (query-parser :message analyzer) (let [qp (query-parser :message analyzer)
raw-query (parse-query qp query-str) raw-query (parse-query qp query-str)
[query filter] (filterify-query raw-query #{"user"}) [query filter] (filterify-query raw-query #{"user"})
hits (search index-searcher query filter max-hits)] [total hits] (search index-searcher query filter max-hits)]
(println "Query:" query) (println "Query:" query)
(println "Filter:" filter) (println "Filter:" filter)
(println ">>" (count hits) "hits for query:" query-str) (println ">>" total "hits for query:" query-str)
(map (vector
#(let [timestamp (-> % :doc :timestamp (Long/parseLong)) total
delta (floor (/ (- (System/currentTimeMillis) timestamp) 1000))] (map
(format #(let [timestamp (-> % :doc :timestamp (Long/parseLong))
"[%s] %s: %s" delta (floor (/ (- (System/currentTimeMillis) timestamp) 1000))]
(fuzzy-relative-time delta) (format
(-> % :doc :user) "[%s] %s: %s"
(-> % :doc :message))) (fuzzy-relative-time delta)
hits))) (-> % :doc :user)
(-> % :doc :message)))
hits))))
(defn schedule-index-chat-log [] (defn schedule-index-chat-log [bot]
(let [executor (Executors/newSingleThreadScheduledExecutor)] (let [executor (Executors/newSingleThreadScheduledExecutor)]
(.scheduleWithFixedDelay (.scheduleWithFixedDelay
executor executor
(fn [] (fn []
(try (try
(with-open [iw (index-writer *index-dir* *analyzer*)] (with-open [iw (index-writer (index-dir bot) *analyzer*)]
(let [chat-log @*chat-log*] (let [chat-log @*chat-log*]
(do (do
(reset! *chat-log* []) (reset! *chat-log* [])
@ -86,17 +88,21 @@
timestamp (.getTimestamp ev) timestamp (.getTimestamp ev)
channel (.getChannel ev)] channel (.getChannel ev)]
(if (.startsWith msg "!q") (if (.startsWith msg "!q")
(with-open [is (index-searcher *index-dir*)] (with-open [is (index-searcher (index-dir bot))]
(let [results (search-chat-log is (trim (subs msg 2)) *max-hits* *analyzer*)] (let [[total results] (search-chat-log is (trim (subs msg 2)) *max-hits* *analyzer*)]
(if (zero? (count results)) (if (zero? total)
(send-message bot channel "No results found") (send-message bot channel "No results found")
(doseq [result results] (do
(send-message bot channel result))))) (send-message
bot channel
(str total " results found. Top " (count results) " results:"))
(doseq [result results]
(send-message bot channel result))))))
(when (and (not (.startsWith msg "!")) (not (*ignored-users* user))) (when (and (not (.startsWith msg "!")) (not (*ignored-users* user)))
(swap! *chat-log* conj [timestamp user msg]))))) (swap! *chat-log* conj [timestamp user msg])))))
(defn run-bot [bot-name server channel] (defn run-bot [bot-name server channel]
(let [bot (make-bot bot-name)] (let [bot (make-bot bot-name)]
(connect-bot bot server channel) (connect-bot bot server channel)
(schedule-index-chat-log) (schedule-index-chat-log bot)
bot)) bot))

View File

@ -46,27 +46,28 @@
[query, nil])) [query, nil]))
(defn search [^IndexSearcher index-searcher ^Query query ^Filter filter ^Integer max-hits] (defn search [^IndexSearcher index-searcher ^Query query ^Filter filter ^Integer max-hits]
(->> (let [top-docs (.search index-searcher query filter max-hits)]
(if (nil? filter) (vector
(.search index-searcher query max-hits) (.totalHits top-docs)
(.search index-searcher query filter max-hits)) (->>
(.scoreDocs) top-docs
seq (.scoreDocs)
(map seq
(fn [^ScoreDoc sd] (map
(hash-map (fn [^ScoreDoc sd]
:score (.score sd) (hash-map
:doc :score (.score sd)
(->> :doc
(.doc index-searcher (.doc sd)) (->>
(.getFields) (.doc index-searcher (.doc sd))
seq (.getFields)
(reduce seq
(fn [m ^Field f] (reduce
(assoc m (fn [m ^Field f]
(keyword (.name f)) (assoc m
(if (.isBinary f) (.getBinaryValue f) (.stringValue f)))) (keyword (.name f))
{}))))))) (if (.isBinary f) (.getBinaryValue f) (.stringValue f))))
{})))))))))
(defn fs-directory [dir-path] (defn fs-directory [dir-path]
(FSDirectory/open (as-file dir-path))) (FSDirectory/open (as-file dir-path)))