vectra-client 1.0.8 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -139,6 +139,36 @@ module Vectra
139
139
  include_values, include_metadata)
140
140
  end
141
141
 
142
+ # Text-only search using Weaviate's BM25 text search
143
+ #
144
+ # @param index [String] class name
145
+ # @param text [String] text query for BM25 search
146
+ # @param top_k [Integer] number of results
147
+ # @param namespace [String, nil] optional namespace (not used in Weaviate)
148
+ # @param filter [Hash, nil] metadata filter
149
+ # @param include_values [Boolean] include vector values
150
+ # @param include_metadata [Boolean] include metadata
151
+ # @return [QueryResult] search results
152
+ def text_search(index:, text:, top_k:, namespace: nil, filter: nil,
153
+ include_values: false, include_metadata: true)
154
+ where_filter = build_where(filter, namespace)
155
+ graphql = build_text_search_graphql(
156
+ index: index,
157
+ text: text,
158
+ top_k: top_k,
159
+ where_filter: where_filter,
160
+ include_values: include_values,
161
+ include_metadata: include_metadata
162
+ )
163
+ body = { "query" => graphql }
164
+
165
+ response = with_error_handling do
166
+ connection.post("#{API_BASE_PATH}/graphql", body)
167
+ end
168
+
169
+ handle_text_search_response(response, index, namespace, include_values, include_metadata)
170
+ end
171
+
142
172
  # rubocop:disable Metrics/PerceivedComplexity
143
173
  def fetch(index:, ids:, namespace: nil)
144
174
  body = {
@@ -337,6 +367,26 @@ module Vectra
337
367
  build_graphql_query(index, top_k, text, alpha, vector, where_filter, selection_block)
338
368
  end
339
369
 
370
+ def build_text_search_graphql(index:, text:, top_k:, where_filter:,
371
+ include_values:, include_metadata:)
372
+ selection_block = build_selection_fields(include_values, include_metadata).join(" ")
373
+ <<~GRAPHQL
374
+ {
375
+ Get {
376
+ #{index}(
377
+ limit: #{top_k}
378
+ bm25: {
379
+ query: "#{text.gsub('"', '\\"')}"
380
+ }
381
+ #{"where: #{JSON.generate(where_filter)}" if where_filter}
382
+ ) {
383
+ #{selection_block}
384
+ }
385
+ }
386
+ }
387
+ GRAPHQL
388
+ end
389
+
340
390
  def build_graphql_query(index, top_k, text, alpha, vector, where_filter, selection_block)
341
391
  <<~GRAPHQL
342
392
  {
@@ -379,6 +429,20 @@ module Vectra
379
429
  end
380
430
  end
381
431
 
432
+ def handle_text_search_response(response, index, namespace, include_values, include_metadata)
433
+ if response.success?
434
+ matches = extract_query_matches(response.body, index, include_values, include_metadata)
435
+ log_debug("Text search returned #{matches.size} results")
436
+
437
+ QueryResult.from_response(
438
+ matches: matches,
439
+ namespace: namespace
440
+ )
441
+ else
442
+ handle_error(response)
443
+ end
444
+ end
445
+
382
446
  def validate_config!
383
447
  super
384
448
  raise ConfigurationError, "Host must be configured for Weaviate" if config.host.nil? || config.host.empty?
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Vectra
4
- VERSION = "1.0.8"
4
+ VERSION = "1.1.1"
5
5
  end
data/lib/vectra.rb CHANGED
@@ -18,6 +18,15 @@ require_relative "vectra/health_check"
18
18
  require_relative "vectra/credential_rotation"
19
19
  require_relative "vectra/audit_log"
20
20
  require_relative "vectra/active_record"
21
+ require_relative "vectra/middleware/request"
22
+ require_relative "vectra/middleware/response"
23
+ require_relative "vectra/middleware/base"
24
+ require_relative "vectra/middleware/stack"
25
+ require_relative "vectra/middleware/logging"
26
+ require_relative "vectra/middleware/retry"
27
+ require_relative "vectra/middleware/instrumentation"
28
+ require_relative "vectra/middleware/pii_redaction"
29
+ require_relative "vectra/middleware/cost_tracker"
21
30
  require_relative "vectra/providers/base"
22
31
  require_relative "vectra/providers/pinecone"
23
32
  require_relative "vectra/providers/qdrant"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vectra-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.8
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mijo Kristo
@@ -268,11 +268,13 @@ files:
268
268
  - docs/guides/faq.md
269
269
  - docs/guides/getting-started.md
270
270
  - docs/guides/installation.md
271
+ - docs/guides/middleware.md
271
272
  - docs/guides/monitoring.md
272
273
  - docs/guides/performance.md
273
274
  - docs/guides/rails-integration.md
274
275
  - docs/guides/rails-troubleshooting.md
275
276
  - docs/guides/recipes.md
277
+ - docs/guides/roadmap.md
276
278
  - docs/guides/runbooks/cache-issues.md
277
279
  - docs/guides/runbooks/high-error-rate.md
278
280
  - docs/guides/runbooks/high-latency.md
@@ -294,6 +296,7 @@ files:
294
296
  - examples/grafana-dashboard.json
295
297
  - examples/grafana-setup.md
296
298
  - examples/instrumentation_demo.rb
299
+ - examples/middleware_demo.rb
297
300
  - examples/prometheus-exporter.rb
298
301
  - lib/generators/vectra/index_generator.rb
299
302
  - lib/generators/vectra/install_generator.rb
@@ -316,6 +319,15 @@ files:
316
319
  - lib/vectra/instrumentation/new_relic.rb
317
320
  - lib/vectra/instrumentation/sentry.rb
318
321
  - lib/vectra/logging.rb
322
+ - lib/vectra/middleware/base.rb
323
+ - lib/vectra/middleware/cost_tracker.rb
324
+ - lib/vectra/middleware/instrumentation.rb
325
+ - lib/vectra/middleware/logging.rb
326
+ - lib/vectra/middleware/pii_redaction.rb
327
+ - lib/vectra/middleware/request.rb
328
+ - lib/vectra/middleware/response.rb
329
+ - lib/vectra/middleware/retry.rb
330
+ - lib/vectra/middleware/stack.rb
319
331
  - lib/vectra/pool.rb
320
332
  - lib/vectra/providers/base.rb
321
333
  - lib/vectra/providers/memory.rb