Module: Mongoid::SearchIndexable

Extended by:
ActiveSupport::Concern
Included in:
Composable
Defined in:
lib/mongoid/search_indexable.rb

Overview

Encapsulates behavior around managing search indexes. This feature is only supported when connected to an Atlas cluster.

Defined Under Namespace

Modules: ClassMethods Classes: Status

Instance Method Summary collapse

Instance Method Details

#auto_embed_search(index: nil, path: nil, limit: 10, num_candidates: nil, filter: nil, exact: false, model: nil, pipeline: []) ⇒ Array<Mongoid::Document>

Performs an Atlas Vector Search query for documents with text similar to this document's stored text field, using auto-embedding. The current document is excluded from the results.

Examples:

Find articles with similar descriptions.

article.auto_embed_search(limit: 5, filter: { status: 'published' })


128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/mongoid/search_indexable.rb', line 128

def auto_embed_search(index: nil, path: nil, limit: 10, num_candidates: nil, filter: nil, exact: false, model: nil, pipeline: []) # rubocop:disable Metrics/ParameterLists
  _index, resolved_path = self.class.send(:resolve_auto_embed_index, index, path)
  text = public_send(resolved_path)

  if text.nil?
    raise ArgumentError,
          "#{resolved_path} is nil on this document; cannot perform auto-embed search"
  end

  self_exclusion = { '$match' => { '_id' => { '$ne' => _id } } }
  post_pipeline = [ self_exclusion, { '$limit' => limit }, *Array(pipeline) ]
  effective_candidates = num_candidates || (limit * 10)

  self.class.auto_embed_search(
    text,
    index: index,
    path: path,
    limit: limit + 1,
    num_candidates: effective_candidates,
    filter: filter,
    exact: exact,
    model: model,
    pipeline: post_pipeline
  )
end

#vector_search(index: nil, path: nil, limit: 10, num_candidates: nil, exact: false, filter: nil, pipeline: []) ⇒ Array<Mongoid::Document>

Performs a vector search for documents similar to this one, using this document's stored embedding as the query vector. The document itself is excluded from the results.

Examples:

Find articles similar to this one.

article.vector_search(limit: 5, filter: { status: 'published' })


82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/mongoid/search_indexable.rb', line 82

def vector_search(index: nil, path: nil, limit: 10, num_candidates: nil, exact: false, filter: nil, pipeline: []) # rubocop:disable Metrics/ParameterLists
  _index, resolved_path = self.class.send(:resolve_vector_index, index, path)
  query_vector = public_send(resolved_path)

  if query_vector.nil?
    raise ArgumentError,
          "#{resolved_path} is nil on this document; cannot perform vector search"
  end

  self_exclusion = { '$match' => { '_id' => { '$ne' => _id } } }
  post_pipeline = [ self_exclusion, { '$limit' => limit }, *Array(pipeline) ]
  effective_candidates = num_candidates || (limit * 10)

  self.class.vector_search(
    query_vector,
    index: index,
    path: path,
    limit: limit + 1,
    num_candidates: effective_candidates,
    exact: exact,
    filter: filter,
    pipeline: post_pipeline
  )
end