Files
integreat/src/clj/auto_ap/search.clj
2023-03-24 11:00:02 -07:00

75 lines
3.4 KiB
Clojure

(ns auto-ap.search
(:require [config.core :refer [env]])
(:import
(java.nio.file Paths)
(org.apache.lucene.analysis.standard StandardAnalyzer)
(org.apache.lucene.document Document Field$Store StoredField StringField TextField)
(org.apache.lucene.index DirectoryReader IndexWriter IndexWriterConfig Term)
(org.apache.lucene.queryparser.classic QueryParser)
(org.apache.lucene.search BooleanClause$Occur BooleanQuery$Builder IndexSearcher PhraseQuery$Builder Query TermQuery)
(org.apache.lucene.store FSDirectory)))
(defn full-index-query [results index-name]
(let [directory (FSDirectory/open (Paths/get (java.net.URI. (str "file:///tmp/search" (:dd-env env) "/" index-name))))
analyzer (StandardAnalyzer.)
index-writer-config (IndexWriterConfig. analyzer)
index-writer (IndexWriter. directory index-writer-config)]
(.deleteAll index-writer)
(try
(doseq [{:keys [text id] :as x} results
:let [doc (doto
(Document.)
(.add (TextField. "name" text Field$Store/YES))
(.add (StoredField. "id" (long id))))]]
(doseq [k (filter (complement #{:text :id}) (keys x))]
(println "K" (name k) (get x k))
(.add doc (StringField. (name k) (str (get x k)) Field$Store/YES)))
(println "adding" text)
(flush)
(.addDocument index-writer doc))
(finally
(.close index-writer)))))
(defn make-query [n]
(let [
text-query (when (:q n)
(.parse (QueryParser. "name" (StandardAnalyzer.)) (:q n)))
text-query-exact (when (:q-exact n)
(.build (doto (PhraseQuery$Builder. )
(.add (Term. "name" (:q-exact n)) 0))))
full-query (BooleanQuery$Builder.)
]
(when text-query
(.add full-query text-query BooleanClause$Occur/MUST))
(when text-query-exact
(.add full-query text-query-exact BooleanClause$Occur/MUST))
(doseq [[k v] (dissoc n :q :q-exact)]
(if (instance? Query v)
(.add full-query v BooleanClause$Occur/MUST)
(.add full-query (TermQuery. (Term. (name k) (str v))) BooleanClause$Occur/MUST)))
(.build full-query)))
(defn search
([n index-name]
(search n index-name []))
([n index-name other-keys]
(let [directory (FSDirectory/open (Paths/get (java.net.URI. (str "file:///tmp/search" (:dd-env env) "/" index-name))))
index-reader (DirectoryReader/open directory)
index-searcher (IndexSearcher. index-reader)]
(for [x (seq (.scoreDocs (.search index-searcher (make-query n) 10)))]
(into
[(Long/parseLong (.get (.doc index-searcher (.-doc x)) "id"))
(.get (.doc index-searcher (.-doc x)) "name")
(.-score x)]
(map (fn [o]
(.get (.doc index-searcher (.-doc x)) o))
other-keys)))))
)
(defn search-ids [n index-name]
(let [directory (FSDirectory/open (Paths/get (java.net.URI. (str "file:///tmp/search" (:dd-env env) "/" index-name))))
index-reader (DirectoryReader/open directory)
index-searcher (IndexSearcher. index-reader)]
(for [x (seq (.scoreDocs (.search index-searcher (make-query n) 100)))]
(Long/parseLong (.get (.doc index-searcher (.-doc x)) "id")))))