Módulo: Mongoid::SearchIndexable::ClassMethods

Definido en:
lib/mongoid/search_indexable.rb

Overview

Implementaciones para los métodos a nivel de clase de la funcionalidad.

Resumen del método de instancia colapsar

Detalles del método de instancia

#auto_embed_search(texto, índice: nil, ruta: nil, límite: 10, num_candidatos: nil, filtro: nil, exacto: false, model: nil, pipeline: []) ⇒ arreglo<Mongoid::Document>

Realiza una consulta de Atlas Vector Search usando autoincrustación. Atlas genera el vector de query a partir del texto suministrado en el momento de la query; no se requiere una incrustación precomputada.

Cada document devuelto tiene un atributo vector_search_score poblado con su puntuación de relevancia. A diferencia de vector_search, el campo de texto indexado se retiene en los documentos devueltos.

Ejemplos:

Buscar por texto.

Article.auto_embed_search('machine learning', limit: 5)

Búsqueda exacta del vecino más cercano (sin numCandidates).

Article.auto_embed_search('deep learning', exact: true, limit: 5)

Parámetros:

  • text (string)

    El texto de consulta.

  • index (String | Symbol | nil) (valor por defecto: nil)

    El nombre del índice de auto-incrustación a utilizar (opcional cuando solo uno está declarado en el model).

  • ruta (String | Symbol | nil) (valor por defecto: nil)

    La ruta de campo de texto indexado (opcional si no hay ambigüedad a partir de la definición del índice).

  • limit (Integer) (por defecto: 10)

    Número máximo de resultados (por defecto: 10).

  • num_candidates (Integer | nil) (valor por defecto: nil)

    Candidatos a búsqueda ANN; por defecto, se limita a * 10. Se ignora cuando exact: true.

  • filtro (Hash | nil) (valor por defecto: nil)

    Filtro opcional de MongoDB para el prefiltrado.

  • exacto (true | false) (por defecto: false)

    Utilizar la búsqueda exacta de vecinos más cercanos (ENN) en lugar de ANN (por defecto: falso). Cuando es verdadero, se omite numCandidates.

  • Modelo (String | nil) (valor por defecto: nil)

    Query-time embedding model override.

  • pipeline (arreglo) (valor por defecto: [])

    Etapas adicionales de agregación añadidas después de la búsqueda vectorial y la proyección de puntuación.

Devuelve:

  • (arreglo<Mongoid::Document>)

    coincidir con documentos, cada uno con un atributo vector_search_score completo.



352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
# Archivo 'lib/mongoid/search_indexable.rb', línea 352

def auto_embed_search(text, index: nulo, ruta: nulo, limit: 10, num_candidates: nulo, filtro: nulo, exacta: false, model: nulo, pipeline: []) # rubocop:disable Metrics/ParameterLists
  resolved_index, resolved_path = resolve_auto_embed_index(index, ruta)

  vs_options = {
    'index' => resolved_index,
    'ruta' => resolved_path,
    'query' => { 'text' => text },
    'limit' => limit
  }
  vs_options['numCandidates'] = num_candidates || (limit * 10) a menos que exacto
  vs_options['exacto'] = true si exacto
  vs_options['filtro'] = filtro si filtro
  vs_options['model'] = Modelo si Modelo

  agg_pipeline = [
    { '$vectorSearch' => vs_options },
    { '$addFields'    => { 'vector_search_score' => { '$meta' => 'vectorSearchScore' } } }
  ]
  agg_pipeline.concat(Arreglo(pipeline))

  Colección.Agregar(agg_pipeline).map { |doc| instanciar(doc) }
end

#create_search_indexesArreglo<String>

Solicitar la creación de todos los índices de búsqueda registrados. Tenga en cuenta que los índices de búsqueda se crean de forma asíncrona y pueden tardar varios minutos en estar completamente disponibles.

Devuelve:

  • (arreglo<String>)

    Los nombres de los índices de búsqueda.



155
156
157
158
159
# Archivo 'lib/mongoid/search_indexable.rb', línea 155

def create_search_indexes
  return si search_index_specs.¿vacío?

  Colección.search_indexes.create_many(search_index_specs)
end

#remove_search_index(nombre: nil, id: nil) ⇒ Object

Remueve el índice de búsqueda especificado por el nombre o ID dado. Se debe proporcionar un nombre O un ID, pero no ambos.

Parámetros:

  • Nombre (String | nil) (valor por defecto: nil)

    el nombre del índice a remover

  • ID (String | nil) (valor por defecto: nil)

    el ID del índice que desea remover



197
198
199
200
201
202
203
204
# Archivo 'lib/mongoid/search_indexable.rb', línea 197

def eliminar_índice_de_búsqueda(nombre: nulo, ID: nulo)
  logger.información(
    "MONGOID: Removing índice de búsqueda '#{name || id}}' " \
    "on colección '#{collection.name}'."
  )

  colección.search_indexes.drop_one(nombre: nombre, id: id)
fin

#remove_search_indexesObject

Nota:

Sería bueno si esto pudiera remover SOLO los índices de búsqueda

Solicite la eliminación de todos los índices de búsqueda registrados. Tenga en cuenta que los índices de búsqueda se borran de manera asincrónica y pueden tardar varios minutos en borrarse por completo.

que se han declarado en el model, pero como el model puede no dar nombre índice, no podemos garantizar que sepamos el nombre o ID de los índices correspondientes. No es irrazonable suponer, sin embargo, que la intención es que el model declare uno a uno todos los índices de búsqueda deseados, por lo que eliminar todos los índices de búsqueda debería ser suficiente. Si en su lugar es necesario eliminar un índice específico o un conjunto de índices, se recomienda usar search_indexes.each con remove_search_index.



218
219
220
221
222
# Archivo 'lib/mongoid/search_indexable.rb', línea 218

def remove_search_indexes
  search_indexes.cada hacer |especificación|
    eliminar_índice_de_búsqueda ID: especificación['id']
  end
end

#search_index(name_or_defn, defn = nil) ⇒ objeto

Agrega una definición de índice para las claves individuales o compuestas proporcionadas.

Ejemplos:

Crear un índice básico.

class Person
  include Mongoid::Document
  field :name, type: String
  search_index({ ... })
  search_index :name_of_index, { ... }
end

Parámetros:

  • name_or_defn (Símbolo | String | Hash)

    Puede ser el nombre del índice que se va a definir, o la definición del índice.

  • defn (encriptada) (valor por defecto: nil)

    La definición del índice de búsqueda.



237
238
239
240
241
242
243
# Archivo 'lib/mongoid/search_indexable.rb', línea 237

def search_index(name_or_defn, defn = nulo)
  Nombre = name_or_defn
  Nombre, defn = nulo, Nombre si Nombre.is_a?(encriptada)

  especificación = { definición: defn }.tocar { |s| s[nombre] = Nombre.to_s si Nombre }
  search_index_specs.push(especificación)
end

#search_indexes(options = {}) ⇒ objeto

Un método conveniente para consultar los índices de búsqueda disponibles en la colección del model actual.

Parámetros:

  • opciones (encriptada) (por defecto: {})

    las opciones para pasar a la query del índice de búsqueda.

Opciones Hash (options):

  • :id (string)

    El ID del índice específico a query (opcional)

  • nombre (string)

    El nombre del índice específico a query (opcional)

  • :aggregate (encriptada)

    El hash de opciones para pasar a la orden de agregación (opcional)



188
189
190
# Archivo 'lib/mongoid/search_indexable.rb', línea 188

def search_indexes(opciones = {})
  Colección.search_indexes(opciones)
end

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

Realiza una query de Atlas Vector Search y retorna documentos coincidentes. Cada document devuelto tiene un atributo vector_search_score complejo con su puntuación de relevancia.

El campo vectorial (dado por path:) se excluye de los documentos devueltos por defecto, ya que los vectores son grandes y rara vez útiles después de la recuperación.

Ejemplos:

Busca a través de un vector de query explícito.

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

Parámetros:

  • vector (arreglo<Numeric>)

    El vector de consulta.

  • index (String | Symbol | nil) (valor por defecto: nil)

    El nombre del índice de búsqueda vectorial a utilizar (opcional si solo se declara uno en el model).

  • ruta (String | Symbol | nil) (valor por defecto: nil)

    El campo que contiene el vector almacenado (opcional si es inequívoco a partir de la definición del índice).

  • limit (Integer) (por defecto: 10)

    El número máximo de resultados (por defecto: 10).

  • num_candidates (Integer | nil) (valor por defecto: nil)

    El número de candidatos a considerar durante la búsqueda ANN; por defecto es límite * 10.

  • filtro (Hash | nil) (valor por defecto: nil)

    Un filtro opcional de MongoDB para prefiltrar candidatos antes de la puntuación.

  • pipeline (arreglo) (valor por defecto: [])

    Etapas adicionales de agregación para añadir después de la búsqueda vectorial y la proyección de puntuación.

Devuelve:

  • (arreglo<Mongoid::Document>)

    coincidir con documentos, cada uno con un atributo vector_search_score completo.



298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
# Archivo 'lib/mongoid/search_indexable.rb', línea 298

def búsqueda vectorial(vector, index: nulo, ruta: nulo, limit: 10, num_candidates: nulo, filtro: nulo, pipeline: []) # rubocop:disable Metrics/ParameterLists
  resolved_index, resolved_path = resolve_vector_index(index, ruta)
  num_candidates ||= limit * 10

  vs_options = {
    'index' => resolved_index,
    'ruta' => resolved_path,
    'queryVector' => vector,
    'numCandidates' => num_candidates,
    'limit' => limit
  }
  vs_options['filtro'] = filtro si filtro

  agg_pipeline = [
    { '$vectorSearch' => vs_options },
    { '$addFields'    => { 'vector_search_score' => { '$meta' => 'vectorSearchScore' } } },
    { '$project'      => { resolved_path => 0 } }
  ]
  agg_pipeline.concat(Arreglo(pipeline))

  Colección.Agregar(agg_pipeline).map { |doc| instanciar(doc) }
end

#vector_search_index(nombre_o_definicion, definicion = nil) ⇒ Objeto

Agrega una definición de índice de búsqueda vectorial. También define un campo vector_search_score de solo lectura en el model la primera vez que se llama, el cual se rellena en los document devueltos por vector_search.

Ejemplos:

Crear un índice de búsqueda vectorial.

class Person
  include Mongoid::Document
  vector_search_index({ fields: [...] })
  vector_search_index :my_vector_index, { fields: [...] }
end

Parámetros:

  • name_or_defn (Símbolo | String | Hash)

    Puede ser el nombre del índice que se va a definir, o la definición del índice.

  • defn (encriptada) (valor por defecto: nil)

    La definición del índice de búsqueda vectorial.



259
260
261
262
263
264
265
266
267
268
269
270
# Archivo 'lib/mongoid/search_indexable.rb', línea 259

def vector_search_index(name_or_defn, defn = nulo)
  Nombre = name_or_defn
  Nombre, defn = nulo, Nombre si Nombre.is_a?(encriptada)

  especificación = { tipo: 'vectorSearch', definición: defn }.tocar { |s| s[nombre] = Nombre.to_s si Nombre }
  search_index_specs.push(especificación)

  return si Campos.key?('vector_search_score')

  Campo :vector_search_score, tipo: Float
  attr_readonly :vector_search_score
end

#wait_for_search_indexes(names, interval: 5) {|SearchIndexable::Status| ... } ⇒ Object

Espera a que se creen los índices de búsqueda nombrados.

Parámetros:

  • nombres (arreglo<String>)

    la lista de nombres de índices que hay que esperar

  • interval (Integer) (por defecto: 5)

    el número de segundos que se debe esperar antes de volver a realizar la consulta (solo se utiliza cuando se proporciona una función de retorno de progreso).

Rendimientos:



168
169
170
171
172
173
174
175
176
# Archivo 'lib/mongoid/search_indexable.rb', línea 168

def wait_for_search_indexes(nombres, interval: 5)
  bucle hacer
    Estado = Estado.Nuevo(get_indexes(nombres))
    rendimiento Estado si ¿block_given?
    break si Estado.¿Listo?

    sueño interval
  end
end