Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/phronmophobic/usearch.clj
A clojure wrapper for usearch, a fast open-source search & clustering engine for vectors.
https://github.com/phronmophobic/usearch.clj
clojure usearch vector-database
Last synced: about 1 month ago
JSON representation
A clojure wrapper for usearch, a fast open-source search & clustering engine for vectors.
- Host: GitHub
- URL: https://github.com/phronmophobic/usearch.clj
- Owner: phronmophobic
- License: apache-2.0
- Created: 2024-01-30T22:34:31.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2024-02-29T00:39:16.000Z (9 months ago)
- Last Synced: 2024-09-29T17:22:39.009Z (about 2 months ago)
- Topics: clojure, usearch, vector-database
- Language: Clojure
- Homepage:
- Size: 47.9 KB
- Stars: 12
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# usearch.clj
A clojure wrapper for [usearch](https://github.com/unum-cloud/usearch), a fast open-source search & clustering engine for vectors.
## Dependency
```clojure
com.phronemophobic/usearch-clj {:mvn/version "1.0"}
;; native deps
com.phronemophobic.cljonda/usearch-c-linux-x86-64 {:mvn/version "ce54b814a8a10f4c0c32fee7aad9451231b63f75"}
com.phronemophobic.cljonda/usearch-c-darwin-aarch64 {:mvn/version "ce54b814a8a10f4c0c32fee7aad9451231b63f75"}
com.phronemophobic.cljonda/usearch-c-darwin-x86-64 {:mvn/version "ce54b814a8a10f4c0c32fee7aad9451231b63f75"}
```## Usage
Examples can be found in the [examples directory](https://github.com/phronmophobic/usearch.clj/tree/main/examples).
```clojure
(ns simple
(:require [com.phronemophobic.usearch :as usearch])
(:import java.util.Random))(def random (Random. 42))
(defn rand-vec [dim]
(float-array
(eduction
(map (fn [_]
(.nextFloat random)))
(range dim))))(def dim 512)
;; Generate 100 sample vectors
;; integer keys -> vector.
(def vecs
(into {}
(map (fn [i]
[i (rand-vec dim)]))
(range 100)))(def index
(usearch/init {:dimensions dim
:quantization :quantization/f32}
;; vectors to load
vecs))(count index)
;; 100;; Can check for the presence of keys
(every? #(contains? index %)
(keys vecs))
;; true;; need to reserve more space before adding more vecs
(usearch/reserve index
(+ (usearch/capacity index)
1))
(usearch/add index 101 (rand-vec dim))(count index)
;; 101;; get closest match
(usearch/search index
(float-array (range dim)))
;; returns [key, distance]
;; [16 -71872.88];; lookup vector for 16
(get index 16)
;; #object["[F" 0x4297c486 "[F@4297c486"];; get 10 closest matches
(usearch/search index
(float-array (range dim))
10)
;; [[16 -71872.88] [10 -70801.016] [37 -70298.38] [49 -69604.12] [55 -69434.65] [78 -69195.81] [59 -69186.44] [28 -69116.14] [9 -68563.03] [24 -68498.59]];; Save index to disk
(usearch/save index "simple.usearch");; Load index from disk
(def index-from-disk
(usearch/init {:dimensions dim
:quantization :quantization/f32}))
(usearch/load index-from-disk "simple.usearch")(count index-from-disk)
;; 101```
Warning! usearch.clj is not thread safe and may crash the JVM if used from multiple threads concurrently.
## Docs
[Reference](https://phronmophobic.github.io/usearch.clj/reference/)
For a conceptual overview, see [Semantic Image Search with Clojure](https://phronmophobic.github.io/clip.clj/semantic-image-search-with-clojure/) with example code at https://github.com/phronmophobic/clip.clj/tree/main/examples/wikiart.
## License
Copyright 2024 Adrian Smith. Licensed under Apache License v2.0.