Módulo: Mongoid::SearchIndexable::ClassMethods

Definido em:
lib/mongoid/search_indexable.rb

Visão geral

Implementações para os métodos de nível de classe do recurso.

Recolhimento do Resumo do método de instância

Detalhes do método de instância

#auto_incorporar_pesquisa(texto, índice: nulo, caminho: nulo, limite: 10, num_candidatos: nulo, filtro: nulo, exato: false, model: nulo, pipeline: []) ⇒ Array<Mongoid::Document>

Executa uma query do Atlas Vector Search usando a auto-embedding. O Atlas gera o vetor de query a partir do texto fornecido no momento da query; nenhum embedding pré-computado é necessário.

Cada document retornado tem um atributo vector_search_score preenchido com sua pontuação de relevância. Ao contrário de vector_search, o campo de texto indexado é mantido nos documentos retornados.

Exemplos:

Pesquise por texto.

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

ENN (sem numCandidates).

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

Parâmetros:

  • text (string)

    O texto da query.

  • index (String | Símbolo | nil) (padrão para: nil)

    O nome do índice de incorporação automática a ser usado (opcional quando apenas um é declarado no model).

  • caminho (String | Símbolo | nil) (padrão para: nil)

    O caminho do campo de texto indexado (opcional se não for ambíguo na definição do índice).

  • limit (Inteiro) (padrão para: 10)

    Número máximo de resultados (padrão: 10).

  • num_candidates (Inteiro | nulo) (padrão para: nil)

    Candidatos para pesquisa de ANN; o padrão é limitar * 10. Ignorado quando exato: verdadeiro.

  • filtro, filtro (Hash | nulo) (padrão para: nil)

    Filtro MongoDB opcional para pré-filtragem.

  • exato (verdadeiro | falso) (padrão para: false)

    Use a pesquisa exata do vizinho mais próximo (ENN) em vez de ANN (padrão: falso). Quando verdadeiro, numCandidates é omitido.

  • Modelo (string | nil) (padrão para: nil)

    Substituição do embedding model em tempo de query.

  • gasoduto (Array) (padrão para: [])

    Estágios de agregação adicionais anexados após a pesquisa vetorial e projeção de pontuação .

Retorna:

  • (Array <Mongoid::Document>)

    documentos correspondentes, cada um com um atributo vector_search_score preenchido.



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

def auto_embed_search(text, Índice: nada, caminho: nada, limit: 10, num_candidates: nada, filtro: nada, exato: false, modelo: nada, pipeline: []) # rubocop:disable Metrics/ParameterLists
  modified_index, resolvido_path = resolve_auto_embed_index(index, caminho)

  vs_options = {
    'índice' => modified_index,
    'caminho' => resolvido_path,
    'query' => { 'text' => text },
    'limit' => limit
  }
  vs_options['numCandidates'] = num_candidates || (limit * 10) a menos que exato
  vs_options['exato'] = true se exato
  vs_options['filter'] = filtro, filtro se filtro, filtro
  vs_options['model'] = Modelo se Modelo

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

  collection.Agregação(agg_pipeline).map { |doc| instanciar(doc) }
end

#create_search_indexes ➤ Array<String>

Solicitar a criação de todos os índices de pesquisa registrados. Observe que os índices de pesquisa são criados de forma assíncrona e podem levar alguns minutos para ficarem totalmente disponíveis.

Retorna:

  • (Array<String>)

    Os nomes dos índices de pesquisa.



155
156
157
158
159
# Arquivo 'lib/mongoid/search_indexable.rb', linha 155

def create_search_indexes
  Método se search_index_specs.vazio?

  collection.search_indexes.create_many(search_index_specs)
end

#remove_search_index(name: nil, ID: nil) ➤ Object

Remove o índice de pesquisa especificado pelo nome ou ID fornecido. O nome OU ID deve ser fornecido, mas não ambos.

Parâmetros:

  • name (string | nil) (padrão para: nil)

    o nome do índice a ser removido

  • id (string | nil) (padrão para: nil)

    o ID do índice a ser removido



197
198
199
200
201
202
203
204
# Arquivo 'lib/mongoid/search_indexable.rb', linha 197

def remove_search_index(nome: nada, ID: nada)
  logger.informações(
    "MONGOID: Removendo o índice de pesquisa '#{nome || ID}' " \
    "on collection '#{collection.name}'."
  )

  coleção.search_indexes.drop_one(nome: nome, ID: ID)
fim

#remove_search_indexes ➤ Objeto

Observação:

Seria bom se isso pudesse remover SOMENTE os índices de pesquisa

Solicite a remoção de todos os índices de pesquisa registrados. Observe que os índices de pesquisa são removidos de forma assíncrona e podem levar alguns minutos para serem totalmente excluídos.

que foram declarados no model, mas como o model pode não nomear o índice, não podemos garantir que saberemos o nome ou ID dos índices correspondentes. No entanto, não é irracional presumir que a intenção é que o model declare, individualmente, todos os índices de pesquisa desejados, portanto, a remoção de todos os índices de pesquisa deve ser suficiente. Se um índice ou conjunto de índices específico precisar ser removido, considere usar search_indexes.each com remove_search_index.



218
219
220
221
222
# Arquivo 'lib/mongoid/search_indexable.rb', linha 218

def remove_search_indexes
  search_indexes.cada fazer |especificações|
    remove_search_index ID: especificações['ID']
  end
end

#search_index(name_or_defn, defn = nil) ➤ Objeto

Adiciona uma definição de índice para as chaves únicas ou compostas fornecidas.

Exemplos:

Crie um í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)

    O nome do índice a ser definido ou a definição do índice.

  • defn (Hash) (padrão para: nil)

    A definição do índice de pesquisa .



237
238
239
240
241
242
243
# Arquivo 'lib/mongoid/search_indexable.rb', linha 237

def search_index(name_or_defn, defn = nada)
  name = name_or_defn
  name, defn = nada, name se name.is_a?(Hash)

  especificações = { definição: defn }.toque { |s| s[:name] = name.to_s se name }
  search_index_specs.push(especificações)
end

#search_indexes(opções = {}) ➤ Objeto

Um método de conveniência para consultar os índices de pesquisa disponíveis na coleção do model atual.

Parâmetros:

  • opções (Hash) (padrão para: {})

    as opções a serem passadas para a query do índice de pesquisa de pesquisa.

Hash de opções (opções):

  • :id (string)

    A ID do índice específico para query (opcional)

  • :name (string)

    O nome do índice específico para query (opcional)

  • :aggregate (Hash)

    O hash de opções para passar para o comando agregado (opcional)



188
189
190
# Arquivo 'lib/mongoid/search_indexable.rb', linha 188

def search_indexes(opções = {})
  collection.search_indexes(opções)
end

#vector_search(vetor, índice: nil, caminho: nil, limite: 10, num_candidates: nil, filtro: nil, pipeline: []) ➤ Array<Mongoid::Document>

Executa uma query no Atlas Vector Search e retorna document correspondentes. Cada document retornado tem um atributo vector_search_score preenchido com sua pontuação de relevância.

O campo de vetor (dado por path:) é excluído dos documentos retornados por padrão, pois os vetores são grandes e raramente úteis após a recuperação.

Exemplos:

Pesquise por um vetor de consulta explícito.

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

Parâmetros:

  • vetor (Array<Numeric>)

    O vetor de query.

  • index (String | Símbolo | nil) (padrão para: nil)

    O nome do índice de pesquisa vetorial a ser usado (opcional se apenas um for declarado no model).

  • caminho (String | Símbolo | nil) (padrão para: nil)

    O campo contendo o vetor armazenado (opcional se não houver ambiguidade na definição do índice).

  • limit (Inteiro) (padrão para: 10)

    O número máximo de resultados (padrão: 10).

  • num_candidates (Inteiro | nulo) (padrão para: nil)

    O número de candidatos a considerar durante a pesquisa de ANN; o padrão é limitar * 10.

  • filtro, filtro (Hash | nulo) (padrão para: nil)

    Um filtro opcional do MongoDB para pré-filtrar os candidatos antes de pontuar.

  • gasoduto (Array) (padrão para: [])

    Estágios de agregação adicionais a serem anexados após a pesquisa vetorial e a projeção da pontuação .

Retorna:

  • (Array <Mongoid::Document>)

    documentos correspondentes, cada um com um atributo vector_search_score preenchido.



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

def vector_search(vetor, Índice: nada, caminho: nada, limit: 10, num_candidates: nada, filtro: nada, pipeline: []) # rubocop:disable Metrics/ParameterLists
  modified_index, resolvido_path = resolve_vector_index(index, caminho)
  num_candidates ||= limit * 10

  vs_options = {
    'índice' => modified_index,
    'caminho' => resolvido_path,
    'queryVector' => vetor,
    'numCandidates' => num_candidates,
    'limit' => limit
  }
  vs_options['filter'] = filtro, filtro se filtro, filtro

  agg_pipeline = [
    { '$vectorSearch' => vs_options },
    { '$addFields'    => { 'vector_search_score' => { '$meta' => 'vectorSearchScore' } } },
    { '$ projeto'      => { resolvido_path => 0 } }
  ]
  agg_pipeline.concat(Array(gasoduto))

  collection.Agregação(agg_pipeline).map { |doc| instanciar(doc) }
end

#vector_search_index(name_or_defn, defn = nil) ➤ Objeto

Adiciona uma definição de índice de pesquisa vetorial. Também define um campo vector_search_score somente leitura no modelo na primeira vez que ele é chamado, que é preenchido em documentos retornados por vector_search.

Exemplos:

Crie um índice de pesquisa vetorial.

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)

    O nome do índice a ser definido ou a definição do índice.

  • defn (Hash) (padrão para: nil)

    A definição do índice de pesquisa vetorial.



259
260
261
262
263
264
265
266
267
268
269
270
# Arquivo 'lib/mongoid/search_indexable.rb', linha 259

def vector_search_index(name_or_defn, defn = nada)
  name = name_or_defn
  name, defn = nada, name se name.is_a?(Hash)

  especificações = { tipo: 'vectorSearch', definição: defn }.toque { |s| s[:name] = name.to_s se name }
  search_index_specs.push(especificações)

  Método se Campos.chave?('vector_search_score')

  Campo :vector_search_score, tipo: Float
  attr_readonly :vector_search_score
end

#wait_for_search_indexes(nomes, intervalo: 5) {|SearchIndexable::Status| ... } ➤ Objeto

Aguarde até que os índices de pesquisa nomeados sejam criados.

Parâmetros:

  • nomes (Array<String>)

    a lista de nomes de índice para aguardar

  • interval (Inteiro) (padrão para: 5)

    o número de segundos para aguardar antes de pesquisar novamente (usado somente quando um retorno de chamada de chamada de resposta de progresso é fornecido).

Rendimento:



168
169
170
171
172
173
174
175
176
# Arquivo 'lib/mongoid/search_indexable.rb', linha 168

def wait_for_search_indexes(nomes, interval: 5)
  loop fazer
    Status = Status.Novo(get_indexes(nomes))
    rendimento Status se block_given?
    intervalo se Status.pronto?

    sono interval
  end
end