Saltar al contenido principal
La API de Búsqueda proporciona dos formas de almacenar y recuperar texto:
  • Text Store — almacenamiento vectorial preconfigurado con búsqueda híbrida, deduplicación y agrupamiento. No se requiere configuración de esquema ni de índices.
  • Tablas — acceso de bajo nivel a la base de datos vectorial con control total sobre el esquema, índices, filtros y operaciones de búsqueda.
Comienza con Text Store para la mayoría de los casos de uso. Utiliza Tablas cuando necesites esquemas personalizados, gestión explícita de índices o expresiones de filtro avanzadas. Si necesitas un ejemplo orientado al exterior que muestre cómo GraphRAG supera a la recuperación plana en un benchmark definido, consulta Evaluación de GraphRAG.

Crear un text store

Proporciona un nombre y la dimensión de embedding para tus vectores.
import { SDK } from '@meetkai/mka1';

const mka1 = new SDK({ bearerAuth: '<mka1-api-key>' });

const response = await mka1.search.textStore.createStore(
  {
    storeName: 'product_catalog',
    dimension: 3,
  },
  { headers: { 'X-On-Behalf-Of': '<end-user-id>' } }
);

Agregar textos a un text store

Agrega textos con sus vectores de embedding precomputados. Los textos duplicados se omiten automáticamente. El campo group etiqueta las entradas para que puedas eliminarlas o recuperarlas como un conjunto más adelante.
const response = await mka1.search.textStore.addTexts(
  {
    storeName: 'product_catalog',
    addTextsRequest: {
      texts: [
        'Noise-cancelling over-ear headphones with 30-hour battery.',
        'Compact wireless earbuds with active noise cancellation.',
        'Studio monitor headphones with flat frequency response.',
      ],
      vectors: [
        [0.16, -0.08, 0.29],
        [0.14, -0.06, 0.31],
        [0.09, -0.12, 0.22],
      ],
      group: 'headphones',
    },
  },
  { headers: { 'X-On-Behalf-Of': '<end-user-id>' } }
);

Buscar en un text store

Envía una consulta de texto y su vector de embedding. El servicio realiza una búsqueda híbrida combinando búsqueda de texto completo y similitud vectorial.
const response = await mka1.search.textStore.search(
  {
    storeName: 'product_catalog',
    searchTextsRequest: {
      query: 'noise-cancelling headphones',
      vector: [0.16, -0.08, 0.29],
      limit: 5,
    },
  },
  { headers: { 'X-On-Behalf-Of': '<end-user-id>' } }
);

Eliminar texto de un text store

Elimina entradas específicas por sus valores de texto exactos.
const response = await mka1.search.textStore.deleteTexts(
  {
    storeName: 'product_catalog',
    deleteTextsRequest: {
      texts: [
        'Studio monitor headphones with flat frequency response.',
      ],
    },
  },
  { headers: { 'X-On-Behalf-Of': '<end-user-id>' } }
);

Eliminar textos por grupo de un text store

Elimina todas las entradas que pertenezcan a uno o más grupos.
const response = await mka1.search.textStore.deleteTexts(
  {
    storeName: 'product_catalog',
    deleteTextsRequest: {
      groups: ['headphones'],
    },
  },
  { headers: { 'X-On-Behalf-Of': '<end-user-id>' } }
);

Eliminar un text store

Elimina el store y todos sus datos.
const response = await mka1.search.textStore.deleteStore(
  { storeName: 'product_catalog' },
  { headers: { 'X-On-Behalf-Of': '<end-user-id>' } }
);

Uso avanzado: Tablas

Las Tablas te dan acceso directo a la base de datos vectorial subyacente. Defines el esquema, eliges qué campos indexar, insertas filas estructuradas y compones tú mismo las operaciones de búsqueda.

Campos de esquema

Cada campo en un esquema de tabla tiene un name, type y propiedades opcionales.
TipoDescripciónSoporte de índice
stringDatos de textoFTS (búsqueda de texto completo)
intEntero de 32 bitsBTREE, BITMAP, LABEL_LIST
floatPunto flotante de 64 bitsBTREE, BITMAP, LABEL_LIST
datetimeMarca de tiempo con zona horaria opcionalBTREE
vectorEmbedding de dimensión fijaIVF_FLAT, IVF_PQ, IVF_HNSW_PQ, IVF_HNSW_SQ
listLista de strings, ints o floats
Establece nullable en false para campos obligatorios. Agrega "index": "FTS" en un campo string para habilitar búsqueda de texto completo al momento de la creación. Los campos vectoriales requieren una propiedad dimensions que coincida con el tamaño de tu embedding.

Crear una tabla de búsqueda

Define una tabla con un esquema que describa tus registros. El siguiente ejemplo crea una base de conocimientos de soporte con un campo de texto indexado para búsqueda de texto completo y un campo vectorial para búsqueda semántica.
const response = await mka1.search.tables.create(
  {
    name: 'support_kb',
    schema: {
      fields: [
        { name: 'id', type: 'string', nullable: false },
        { name: 'content', type: 'string', nullable: false, index: 'FTS' },
        { name: 'category', type: 'string', nullable: false },
        { name: 'rating', type: 'float', nullable: true },
        { name: 'embedding', type: 'vector', nullable: false, dimensions: 3 },
      ],
    },
  },
  { headers: { 'X-On-Behalf-Of': '<end-user-id>' } }
);

Insertar filas

Inserta registros que coincidan con el esquema de la tabla. Puedes enviar varias filas en una sola solicitud.
const response = await mka1.search.tables.insertData(
  {
    tableName: 'support_kb',
    insertDataRequest: {
      data: [
        {
          id: 'doc_001',
          content: 'Reset your password from the account settings page.',
          category: 'account',
          rating: 4.7,
          embedding: [0.13, -0.09, 0.41],
        },
        {
          id: 'doc_002',
          content: 'Use two-factor authentication for added account security.',
          category: 'security',
          rating: 4.9,
          embedding: [0.07, -0.02, 0.36],
        },
      ],
    },
  },
  { headers: { 'X-On-Behalf-Of': '<end-user-id>' } }
);

Operaciones de búsqueda

La búsqueda en tablas te permite componer múltiples operaciones en una sola solicitud. Las operaciones se ejecutan en orden — comienza con una búsqueda primaria, luego refina con filtros, límites u offsets. Operaciones primarias inicializan el conjunto de resultados:
OperaciónDescripción
vector_searchEncuentra filas más cercanas a un vector de consulta. Soporta los tipos de distancia cosine, l2, dot y hamming.
ftsBúsqueda de palabras clave de texto completo en uno o más campos string.
Operaciones secundarias refinan los resultados:
OperaciónDescripción
filterAplica una expresión tipo SQL. Establece prefilter en true para filtrar antes del ranking.
limitLimita la cantidad de filas devueltas.
offsetOmite las primeras N filas para paginación.
Utiliza returnColumns para controlar qué campos regresan en la respuesta.

Buscar en la tabla

El siguiente ejemplo combina una búsqueda vectorial con un prefiltro en el campo category.
const response = await mka1.search.tables.search(
  {
    tableName: 'support_kb',
    searchRequest: {
      operations: [
        {
          type: 'vector_search',
          field: 'embedding',
          vector: [0.11, -0.06, 0.37],
          distanceType: 'cosine',
          limit: 5,
        },
        {
          type: 'filter',
          expression: "category = 'security'",
          prefilter: true,
        },
      ],
      returnColumns: ['id', 'content', 'category', 'rating'],
    },
  },
  { headers: { 'X-On-Behalf-Of': '<end-user-id>' } }
);

Eliminar filas

Elimina filas de una tabla usando una expresión de filtro.
const response = await mka1.search.tables.deleteData(
  {
    tableName: 'support_kb',
    deleteDataRequest: {
      filter: "id IN ('doc_001', 'doc_002')",
    },
  },
  { headers: { 'X-On-Behalf-Of': '<end-user-id>' } }
);

Eliminar una tabla

Elimina la tabla y todos sus datos.
const response = await mka1.search.tables.delete(
  { tableName: 'support_kb' },
  { headers: { 'X-On-Behalf-Of': '<end-user-id>' } }
);