Module: Legion::Data::Vector
- Defined in:
- lib/legion/data/vector.rb
Class Method Summary collapse
- .available? ⇒ Boolean
- .cosine_search(table:, column:, query_vector:, limit: 10, min_similarity: 0.0) ⇒ Object
- .ensure_extension! ⇒ Object
- .l2_search(table:, column:, query_vector:, limit: 10) ⇒ Object
Class Method Details
.available? ⇒ Boolean
7 8 9 10 11 12 13 14 15 |
# File 'lib/legion/data/vector.rb', line 7 def available? return false unless Legion::Data.connection return false unless Legion::Data.connection.adapter_scheme == :postgres Legion::Data.connection.fetch("SELECT 1 FROM pg_extension WHERE extname = 'vector'").any? rescue StandardError => e Legion::Logging.debug("Vector#available? check failed: #{e.}") if defined?(Legion::Logging) false end |
.cosine_search(table:, column:, query_vector:, limit: 10, min_similarity: 0.0) ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/legion/data/vector.rb', line 28 def cosine_search(table:, column:, query_vector:, limit: 10, min_similarity: 0.0) return [] unless available? Legion::Logging.debug "Vector cosine_search: table=#{table} column=#{column} limit=#{limit}" if defined?(Legion::Logging) vec_literal = vector_literal(query_vector) ds = Legion::Data.connection[table] .select_all .select_append(Sequel.lit("1 - (#{column} <=> ?)", vec_literal).as(:similarity)) .order(Sequel.lit("#{column} <=> ?", vec_literal)) .limit(limit) ds = ds.where(Sequel.lit("1 - (#{column} <=> ?) >= ?", vec_literal, min_similarity)) if min_similarity.positive? ds.all end |
.ensure_extension! ⇒ Object
17 18 19 20 21 22 23 24 25 26 |
# File 'lib/legion/data/vector.rb', line 17 def ensure_extension! return false unless Legion::Data.connection&.adapter_scheme == :postgres Legion::Data.connection.run('CREATE EXTENSION IF NOT EXISTS vector') Legion::Logging.info 'pgvector extension enabled' if defined?(Legion::Logging) true rescue StandardError => e Legion::Logging.warn("pgvector extension creation failed: #{e.}") if defined?(Legion::Logging) false end |
.l2_search(table:, column:, query_vector:, limit: 10) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/legion/data/vector.rb', line 43 def l2_search(table:, column:, query_vector:, limit: 10) return [] unless available? Legion::Logging.debug "Vector l2_search: table=#{table} column=#{column} limit=#{limit}" if defined?(Legion::Logging) vec_literal = vector_literal(query_vector) Legion::Data.connection[table] .select_all .select_append(Sequel.lit("#{column} <-> ?", vec_literal).as(:distance)) .order(Sequel.lit("#{column} <-> ?", vec_literal)) .limit(limit) .all end |