Added per bot instance index directory support. Added total search results count display.
parent
3bf0253f69
commit
675480aa9c
|
@ -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))
|
||||||
|
|
|
@ -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)))
|
||||||
|
|
Loading…
Reference in New Issue