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

View File

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