/
search.clj
71 lines (60 loc) · 2.57 KB
/
search.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
(ns getclojure.search
(:require [clojure.string :as string]
[clojurewerkz.elastisch.query :as q]
[clojurewerkz.elastisch.rest.document :as esd]
[clojurewerkz.elastisch.rest.index :as esi]
[getclojure.util :as util]))
(def custom-analyzer
{:custom_analyzer {:type "custom"
:tokenizer "custom_tokenizer"
:filter "custom_filter"}})
(def custom-filter
{:custom_filter {:type "lowercase"}})
(def custom-tokenizer
{:custom_tokenizer {:type "pattern"
:pattern "[\\s\\(\\)\\[\\]\\{\\}]+"}})
(def mappings
{:sexp
{:properties
{:id {:type "integer" :store "yes"}
:input {:type "string" :store "yes" :analyzer "custom_analyzer"}
:output {:type "string" :store "yes" :analyzer "custom_analyzer"}
:value {:type "string" :store "yes" :analyzer "custom_analyzer"}}}})
(defn create-getclojure-index []
(when-not (esi/exists? "getclojure")
(esi/create "getclojure"
:settings {:index {:analysis {:analyzer custom-analyzer
:tokenizer custom-tokenizer
:filter custom-filter}}}
:mappings mappings)))
(defn add-to-index [env sexp-map]
(esd/put (name env) "sexp" (util/uuid) sexp-map))
;; :from, :size
(defn search-sexps [q page-num]
(let [offset (* (Integer/parseInt page-num) 25)
query (if (empty? q) "comp AND juxt" q)
lowercased-query (string/lower-case query)]
(esd/search "getclojure"
"sexp"
:query (q/dis-max :queries [(q/term :input query
:boost 2.0)
(q/term :input lowercased-query
:boost 2.0)
(q/term :output query)
(q/term :output lowercased-query)
(q/term :value query)
(q/term :value lowercased-query)])
:from offset
:size 25)))
(defn get-num-hits [q page-num]
(get-in (search-sexps q page-num) [:hits :total]))
(defn get-search-hits [result-map]
(map :_source (get-in result-map [:hits :hits])))
(defn search-results-for [q page-num]
(get-search-hits (search-sexps q page-num)))
(comment
(require '[clojurewerkz.elastisch.rest :as esr])
(esr/connect! "http://127.0.0.1:9200")
(esi/delete "getclojure")
(create-getclojure-index)
)