Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Руководство [8.17] ›Отображение ›Типы данных полей

Тип поля плотного вектора

Тип поля dense_vector хранит плотные векторы числовых значений. Поля плотных векторов в основном используются для поиска k ближайших соседей (kNN).

Тип dense_vector не поддерживает агрегации или сортировку.

Вы добавляете поле dense_vector как массив числовых значений на основе element_type по умолчанию с float:

resp = client.indices.create(
    index="my-index",
    mappings={
        "properties": {
            "my_vector": {
                "type": "dense_vector",
                "dims": 3
            },
            "my_text": {
                "type": "keyword"
            }
        }
    },
)
print(resp)

resp1 = client.index(
    index="my-index",
    id="1",
    document={
        "my_text": "text1",
        "my_vector": [
            0.5,
            10,
            6
        ]
    },
)
print(resp1)

resp2 = client.index(
    index="my-index",
    id="2",
    document={
        "my_text": "text2",
        "my_vector": [
            -0.5,
            10,
            10
        ]
    },
)
print(resp2)
response = client.indices.create(
  index: 'my-index',
  body: {
    mappings: {
      properties: {
        my_vector: {
          type: 'dense_vector',
          dims: 3
        },
        my_text: {
          type: 'keyword'
        }
      }
    }
  }
)
puts response

response = client.index(
  index: 'my-index',
  id: 1,
  body: {
    my_text: 'text1',
    my_vector: [
      0.5,
      10,
      6
    ]
  }
)
puts response

response = client.index(
  index: 'my-index',
  id: 2,
  body: {
    my_text: 'text2',
    my_vector: [
      -0.5,
      10,
      10
    ]
  }
)
puts response
const response = await client.indices.create({
  index: "my-index",
  mappings: {
    properties: {
      my_vector: {
        type: "dense_vector",
        dims: 3,
      },
      my_text: {
        type: "keyword",
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "my-index",
  id: 1,
  document: {
    my_text: "text1",
    my_vector: [0.5, 10, 6],
  },
});
console.log(response1);

const response2 = await client.index({
  index: "my-index",
  id: 2,
  document: {
    my_text: "text2",
    my_vector: [-0.5, 10, 10],
  },
});
console.log(response2);
PUT my-index
{
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "dims": 3
      },
      "my_text" : {
        "type" : "keyword"
      }
    }
  }
}

PUT my-index/_doc/1
{
  "my_text" : "text1",
  "my_vector" : [0.5, 10, 6]
}

PUT my-index/_doc/2
{
  "my_text" : "text2",
  "my_vector" : [-0.5, 10, 10]
}

В отличие от большинства других типов данных, плотные векторы всегда имеют одно значение. Невозможно хранить несколько значений в одном поле dense_vector.

Индексирование векторов для поиска k ближайших соседей

Поиск k ближайших соседей (kNN) находит k ближайших векторов к запросу вектора, измеренных с помощью метрики сходства.

Поля плотных векторов могут использоваться для ранжирования документов в script_score запросах. Это позволяет выполнять поиск k ближайших соседей методом перебора, сканируя все документы и ранжируя их по сходству.

Во многих случаях поиск k ближайших соседей методом перебора недостаточно эффективен. По этой причине тип dense_vector поддерживает индексирование векторов в специализированную структуру данных для поддержки быстрого поиска k ближайших соседей с помощью параметра knn в API поиска.

Неотображенные массивы элементов с плавающей запятой размером от 128 до 4096 динамически отображаются как dense_vector с по умолчанию сходством cosine. Вы можете переопределить сходство по умолчанию, явно отобразив поле как dense_vector с желаемым сходством.

Индексирование по умолчанию включено для полей плотных векторов и индексируется как int8_hnsw. При включенном индексировании вы можете определить метрику сходства векторов для использования в поиске k ближайших соседей:

resp = client.indices.create(
    index="my-index-2",
    mappings={
        "properties": {
            "my_vector": {
                "type": "dense_vector",
                "dims": 3,
                "similarity": "dot_product"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-2',
  body: {
    mappings: {
      properties: {
        my_vector: {
          type: 'dense_vector',
          dims: 3,
          similarity: 'dot_product'
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-2",
  mappings: {
    properties: {
      my_vector: {
        type: "dense_vector",
        dims: 3,
        similarity: "dot_product",
      },
    },
  },
});
console.log(response);
PUT my-index-2
{
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "dims": 3,
        "similarity": "dot_product"
      }
    }
  }
}

Индексирование векторов для приближенного поиска k ближайших соседей — это дорогостоящий процесс. Может потребоваться значительное время для обработки документов, содержащих поля векторов с index. См. поиск k ближайших соседей (kNN) для получения дополнительной информации о требованиях к памяти.

Вы можете отключить индексирование, установив параметр index в false:

resp = client.indices.create(
    index="my-index-2",
    mappings={
        "properties": {
            "my_vector": {
                "type": "dense_vector",
                "dims": 3,
                "index": False
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-2',
  body: {
    mappings: {
      properties: {
        my_vector: {
          type: 'dense_vector',
          dims: 3,
          index: false
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-2",
  mappings: {
    properties: {
      my_vector: {
        type: "dense_vector",
        dims: 3,
        index: false,
      },
    },
  },
});
console.log(response);
PUT my-index-2
{
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "dims": 3,
        "index": false
      }
    }
  }
}

Elasticsearch использует алгоритм HNSW для поддержки эффективного поиска k ближайших соседей. Как и большинство алгоритмов kNN, HNSW является приближенным методом, который жертвует точностью результата для повышения скорости.

Автоматическое квантование векторов для поиска k ближайших соседей

Тип dense_vector поддерживает квантование для уменьшения объема памяти, требуемого при поиске float векторов. Поддерживаются три стратегии квантования:

  • int8 - Квантует каждую размерность вектора до целых чисел с 1 байтом. Это уменьшает объем памяти на 75% (или в 4 раза) за счет некоторой точности.
  • int4 - Квантует каждую размерность вектора до целых чисел с половинным байтом. Это уменьшает объем памяти на 87% (или в 8 раз) за счет точности.
  • bbq - [предварительный просмотр] Эта функциональность находится на стадии технического предварительного просмотра и может быть изменена или удалена в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции предварительного просмотра не подпадают под SLA поддержки официальных функций GA. Лучшее бинарное квантование, которое уменьшает каждую размерность до точности одного бита. Это уменьшает объем памяти на 96% (или в 32 раза) за счет большей потери точности. Как правило, передискретизация во время запроса и повторное ранжирование могут помочь смягчить потерю точности.

При использовании квантованного формата вам может потребоваться передискретизация и повторное ранжирование результатов для повышения точности. Подробнее см. передискретизацию и повторное ранжирование.

Для использования квантованного индекса вы можете установить тип индекса на int8_hnsw, int4_hnsw или bbq_hnsw. При индексировании float векторов текущий тип индекса по умолчанию — int8_hnsw.

Квантование будет продолжать сохранять исходные значения векторов с плавающей запятой на диске для повторного ранжирования, повторного индексирования и улучшения квантования в течение всего срока службы данных. Это означает, что использование диска увеличится примерно на 25% для int8, примерно на 12,5% для int4 и примерно на 3,1% для bbq из-за накладных расходов на хранение квантованных и исходных векторов.

int4 квантование требует четного числа размерностей векторов.

[предварительный просмотр] Эта функциональность находится на стадии технического предварительного просмотра и может быть изменена или удалена в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции предварительного просмотра не подпадают под SLA поддержки официальных функций GA. bbq квантование поддерживает только размерности векторов, превышающие 64.

Вот пример создания индекса с байтовым квантованием:

resp = client.indices.create(
    index="my-byte-quantized-index",
    mappings={
        "properties": {
            "my_vector": {
                "type": "dense_vector",
                "dims": 3,
                "index": True,
                "index_options": {
                    "type": "int8_hnsw"
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-byte-quantized-index',
  body: {
    mappings: {
      properties: {
        my_vector: {
          type: 'dense_vector',
          dims: 3,
          index: true,
          index_options: {
            type: 'int8_hnsw'
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-byte-quantized-index",
  mappings: {
    properties: {
      my_vector: {
        type: "dense_vector",
        dims: 3,
        index: true,
        index_options: {
          type: "int8_hnsw",
        },
      },
    },
  },
});
console.log(response);
PUT my-byte-quantized-index
{
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "dims": 3,
        "index": true,
        "index_options": {
          "type": "int8_hnsw"
        }
      }
    }
  }
}

Вот пример создания индекса с полубайтовым квантованием:

resp = client.indices.create(
    index="my-byte-quantized-index",
    mappings={
        "properties": {
            "my_vector": {
                "type": "dense_vector",
                "dims": 4,
                "index": True,
                "index_options": {
                    "type": "int4_hnsw"
                }
            }
        }
    },
)
print(resp)
const response = await client.indices.create({
  index: "my-byte-quantized-index",
  mappings: {
    properties: {
      my_vector: {
        type: "dense_vector",
        dims: 4,
        index: true,
        index_options: {
          type: "int4_hnsw",
        },
      },
    },
  },
});
console.log(response);
PUT my-byte-quantized-index
{
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "dims": 4,
        "index": true,
        "index_options": {
          "type": "int4_hnsw"
        }
      }
    }
  }
}

[предварительный просмотр] Эта функциональность находится на стадии технического предварительного просмотра и может быть изменена или удалена в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции предварительного просмотра не подпадают под SLA поддержки официальных функций GA. Вот пример создания бинарного квантованного индекса:

resp = client.indices.create(
    index="my-byte-quantized-index",
    mappings={
        "properties": {
            "my_vector": {
                "type": "dense_vector",
                "dims": 64,
                "index": True,
                "index_options": {
                    "type": "bbq_hnsw"
                }
            }
        }
    },
)
print(resp)
const response = await client.indices.create({
  index: "my-byte-quantized-index",
  mappings: {
    properties: {
      my_vector: {
        type: "dense_vector",
        dims: 64,
        index: true,
        index_options: {
          type: "bbq_hnsw",
        },
      },
    },
  },
});
console.log(response);
PUT my-byte-quantized-index
{
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "dims": 64,
        "index": true,
        "index_options": {
          "type": "bbq_hnsw"
        }
      }
    }
  }
}

Параметры для плотных векторных полей

Принимаются следующие параметры отображения:

element_type
(Необязательно, строка) Тип данных, используемый для кодирования векторов. Поддерживаемые типы данных: float (по умолчанию), byte и бит.
Допустимые значения для element_type
float
индексирует 4-байтовое значение с плавающей точкой на каждую размерность. Это значение по умолчанию.
byte
индексирует 1-байтовое целочисленное значение на каждую размерность.
bit
индексирует один бит на каждую размерность. Полезно для векторов очень высокой размерности или моделей, которые специально поддерживают битовые векторы. ПРИМЕЧАНИЕ: при использовании bit число измерений должно быть кратно 8 и представлять количество бит.
dims
(Необязательно, целое число) Число измерений вектора. Не может превышать 4096. Если dims не указан, он будет установлен в длину первого вектора, добавленного в поле.
index
(Необязательно, логическое значение) Если true, можно искать в этом поле с помощью API поиска kNN. По умолчанию true.
similarity

(Необязательно*, строка) Метрика сходства векторов для использования в поиске kNN. Документы ранжируются по сходству их векторного поля с запрошенным вектором. _score каждого документа будет выведена из сходства таким образом, чтобы гарантировать, что оценки положительны и что большая оценка соответствует более высокому рангу. По умолчанию l2_norm, когда element_type: bit в противном случае по умолчанию cosine.

* Этот параметр может быть указан только в том случае, если index равен true.

Векторы bit поддерживают только l2_norm в качестве метрики сходства.

Допустимые значения для similarity
l2_norm
Вычисляет сходство на основе расстояния L2 (также известного как евклидово расстояние) между векторами. Документ _score вычисляется как 1 / (1 + l2_norm(query, vector)^2).

Для векторов bit вместо использования l2_norm используется расстояние hamming между векторами. Преобразование _score равно (numBits - hamming(a, b)) / numBits

dot_product

Вычисляет скалярное произведение двух единичных векторов. Этот вариант обеспечивает оптимизированный способ вычисления косинусного сходства. Ограничения и вычисляемая оценка определяются element_type.

Когда element_type равно float, все векторы должны иметь единичную длину, включая векторы документа и запроса. Документ _score вычисляется как (1 + dot_product(query, vector)) / 2.

Когда element_type равно byte, все векторы должны иметь одинаковую длину, включая векторы документа и запроса, иначе результаты будут неточными. Документ _score вычисляется как 0.5 + (dot_product(query, vector) / (32768 * dims)), где dims — число измерений на вектор.

cosine
Вычисляет косинусное сходство. Во время индексирования Elasticsearch автоматически нормализует векторы с cosine сходством до единичной длины. Это позволяет использовать dot_product для вычисления сходства, что более эффективно. Исходные ненормализованные векторы по-прежнему доступны через скрипты. Документ _score вычисляется как (1 + cosine(query, vector)) / 2. Сходство cosine не допускает векторов с нулевой величиной, так как косинус в этом случае не определен.
max_inner_product
Вычисляет максимальное скалярное произведение двух векторов. Это похоже на dot_product, но не требует нормализации векторов. Это означает, что величина каждого вектора может значительно повлиять на оценку. Документ _score корректируется для предотвращения отрицательных значений. Для max_inner_product значений < 0, _score равно 1 / (1 + -1 * max_inner_product(query, vector)). Для неотрицательных результатов max_inner_product, _score вычисляется как max_inner_product(query, vector) + 1.

Несмотря на концептуальную связь, параметр similarity отличается от поля text similarity и принимает другой набор параметров.

index_options

(Необязательно*, объект) Необязательный раздел, настраивающий алгоритм индексирования kNN. Алгоритм HNSW имеет два внутренних параметра, влияющих на построение структуры данных. Их можно настроить для повышения точности результатов, но это замедлит скорость индексирования.

* Этот параметр можно указать только тогда, когда index равен true.

Свойства index_options
type

(Обязательно, строка) Тип используемого алгоритма kNN. Может быть любым из следующих:

  • hnsw - Использует алгоритм HNSW для масштабируемого приближенного поиска kNN. Поддерживает все значения element_type.
  • int8_hnsw - Тип индекса по умолчанию для векторов с плавающей точкой. Использует алгоритм HNSW, а также автоматически скалярное квантование для масштабируемого приближенного поиска kNN с element_type значения float. Это может уменьшить объем памяти в 4 раза ценой некоторой точности. См. Автоматическое квантование векторов для поиска kNN.
  • int4_hnsw - Использует алгоритм HNSW, а также автоматически скалярное квантование для масштабируемого приближенного поиска kNN с element_type значения float. Это может уменьшить объем памяти в 8 раз ценой некоторой точности. См. Автоматическое квантование векторов для поиска kNN.
  • [preview] Данная функциональность находится в техническом предварительном просмотре и может быть изменена или удалена в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции технического предварительного просмотра не подпадают под SLA поддержки официальных функций GA. bbq_hnsw - Использует алгоритм HNSW, а также автоматически бинарное квантование для масштабируемого приближенного поиска kNN с element_type значения float. Это может уменьшить объем памяти в 32 раза ценой точности. См. Автоматическое квантование векторов для поиска kNN.
  • flat - Использует алгоритм полного перебора для точного поиска kNN. Поддерживает все значения element_type.
  • int8_flat - Использует алгоритм полного перебора, а также автоматически скалярное квантование. Поддерживает только element_type значения float.
  • int4_flat - Использует алгоритм полного перебора, а также автоматически скалярное квантование с половиной байта. Поддерживает только element_type значения float.
  • [preview] Данная функциональность находится в техническом предварительном просмотре и может быть изменена или удалена в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции технического предварительного просмотра не подпадают под SLA поддержки официальных функций GA. bbq_flat - Использует алгоритм полного перебора, а также автоматически бинарное квантование. Поддерживает только element_type значения float.
m
(Необязательно, целое число) Количество соседей, к которым будет подключен каждый узел в графе HNSW. По умолчанию 16. Применимо только к типам индексов hnsw, int8_hnsw, int4_hnsw и bbq_hnsw.
ef_construction
(Необязательно, целое число) Количество кандидатов для отслеживания при сборке списка ближайших соседей для каждого нового узла. По умолчанию 100. Применимо только к типам индексов hnsw, int8_hnsw, int4_hnsw и bbq_hnsw.
confidence_interval
(Необязательно, число с плавающей точкой) Применимо только к типам индексов int8_hnsw, int4_hnsw, int8_flat и int4_flat. Интервал доверия, используемый при квантовании векторов. Может принимать любое значение от и включая 0.90 и 1.0 или точно 0. Когда значение равно 0, это означает, что динамические квантили должны быть вычислены для оптимизированного квантования. Если значение находится между 0.90 и 1.0, это значение ограничивает значения, используемые при вычислении пороговых значений квантования. Например, значение 0.95 будет использовать только средние 95% значений при вычислении пороговых значений квантования (например, самые высокие и самые низкие 2,5% значений будут проигнорированы). По умолчанию равно 1/(dims + 1) для int8 квантованных векторов и 0 для int4 для вычисления динамических квантилей.

Синтетические _source

Синтетические _source доступны в общем доступе только для индексов TSDB (индексы, у которых index.mode установлено в time_series). Для других индексов синтетические _source находятся в техническом предварительном просмотре. Функции в техническом предварительном просмотре могут быть изменены или удалены в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции технического предварительного просмотра не подпадают под SLA поддержки официальных функций GA.

Поля dense_vector поддерживают синтетический _source.

Индексирование и поиск битовых векторов

При использовании element_type: bit, все векторы будут обрабатываться как битовые векторы. Битовые векторы используют только один бит на измерение и кодируются как байты внутри. Это может быть полезно для векторов очень высокой размерности или моделей.

При использовании bit, количество измерений должно быть кратно 8 и должно представлять количество битов. Кроме того, для векторов bit, типичные значения сходства векторов фактически все одинаково оцениваются, например, с помощью расстояния hamming.

Сравним два массива byte[], каждый из которых представляет 40 отдельных битов.

[-127, 0, 1, 42, 127] в битах 1000000100000000000000010010101001111111 [127, -127, 0, 1, 42] в битах 0111111110000001000000000000000100101010

При сравнении этих двух битовых векторов сначала вычисляется расстояние Хэмминга.

Результат вычисления hamming расстояния:

1000000100000000000000010010101001111111
^
0111111110000001000000000000000100101010
=
1111111010000001000000010010101101010101

Затем подсчитывается количество 1 бит в результате xor: 18. Для масштабирования оценки вычитаем полученное значение из общего числа бит и разделим на общее количество бит: (40 - 18) / 40 = 0.55. Это будет значение _score между этими двумя векторами.

Вот пример индексирования и поиска битовых векторов:

resp = client.indices.create(
    index="my-bit-vectors",
    mappings={
        "properties": {
            "my_vector": {
                "type": "dense_vector",
                "dims": 40,
                "element_type": "bit"
            }
        }
    },
)
print(resp)
const response = await client.indices.create({
  index: "my-bit-vectors",
  mappings: {
    properties: {
      my_vector: {
        type: "dense_vector",
        dims: 40,
        element_type: "bit",
      },
    },
  },
});
console.log(response);
PUT my-bit-vectors
{
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "dims": 40, 
        "element_type": "bit"
      }
    }
  }
}

Количество измерений, представляющее количество битов

resp = client.bulk(
    index="my-bit-vectors",
    refresh=True,
    operations=[
        {
            "index": {
                "_id": "1"
            }
        },
        {
            "my_vector": [
                127,
                -127,
                0,
                1,
                42
            ]
        },
        {
            "index": {
                "_id": "2"
            }
        },
        {
            "my_vector": "8100012a7f"
        }
    ],
)
print(resp)
const response = await client.bulk({
  index: "my-bit-vectors",
  refresh: "true",
  operations: [
    {
      index: {
        _id: "1",
      },
    },
    {
      my_vector: [127, -127, 0, 1, 42],
    },
    {
      index: {
        _id: "2",
      },
    },
    {
      my_vector: "8100012a7f",
    },
  ],
});
console.log(response);
POST /my-bit-vectors/_bulk?refresh
{"index": {"_id" : "1"}}
{"my_vector": [127, -127, 0, 1, 42]} 
{"index": {"_id" : "2"}}
{"my_vector": "8100012a7f"} 

5 байт, представляющих вектор с 40 битовыми измерениями

Шестнадцатеричная строка, представляющая вектор с 40 битовыми измерениями

Затем при поиске вы можете использовать запрос knn для поиска похожих битовых векторов:

resp = client.search(
    index="my-bit-vectors",
    filter_path="hits.hits",
    query={
        "knn": {
            "query_vector": [
                127,
                -127,
                0,
                1,
                42
            ],
            "field": "my_vector"
        }
    },
)
print(resp)
const response = await client.search({
  index: "my-bit-vectors",
  filter_path: "hits.hits",
  query: {
    knn: {
      query_vector: [127, -127, 0, 1, 42],
      field: "my_vector",
    },
  },
});
console.log(response);
POST /my-bit-vectors/_search?filter_path=hits.hits
{
  "query": {
    "knn": {
      "query_vector": [127, -127, 0, 1, 42],
      "field": "my_vector"
    }
  }
}
{
    "hits": {
        "hits": [
            {
                "_index": "my-bit-vectors",
                "_id": "1",
                "_score": 1.0,
                "_source": {
                    "my_vector": [
                        127,
                        -127,
                        0,
                        1,
                        42
                    ]
                }
            },
            {
                "_index": "my-bit-vectors",
                "_id": "2",
                "_score": 0.55,
                "_source": {
                    "my_vector": "8100012a7f"
                }
            }
        ]
    }
}

Тип поля, подлежащий обновлению

Для лучшего масштабирования и производительности, обновление параметра type в index_options возможно с помощью API обновления схемы в соответствии с приведенной ниже диаграммой (разрешены переходы):

flat --> int8_flat --> int4_flat --> hnsw --> int8_hnsw --> int4_hnsw

Для обновления всех типов HNSW (hnsw, int8_hnsw, int4_hnsw) количество подключений m должно оставаться неизменным или увеличиваться. Для скалярных квантованных форматов (int8_flat, int4_flat, int8_hnsw, int4_hnsw) значение confidence_interval должно всегда оставаться неизменным (после определения оно не может быть изменено).

Обновление type в index_options не удастся во всех остальных случаях.

Переключение types не переиндексирует векторы, которые уже были индексированы (они будут продолжать использовать свой исходный type), векторы, индексируемые после изменения, будут использовать новый type вместо этого.

Например, можно определить поле векторного типа, использующего тип flat (сырые массивы float32) для первой партии данных, подлежащих индексированию.

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "text_embedding": {
                "type": "dense_vector",
                "dims": 384,
                "index_options": {
                    "type": "flat"
                }
            }
        }
    },
)
print(resp)
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      text_embedding: {
        type: "dense_vector",
        dims: 384,
        index_options: {
          type: "flat",
        },
      },
    },
  },
});
console.log(response);
PUT my-index-000001
{
    "mappings": {
        "properties": {
            "text_embedding": {
                "type": "dense_vector",
                "dims": 384,
                "index_options": {
                    "type": "flat"
                }
            }
        }
    }
}

Изменение type на int4_hnsw гарантирует, что векторы, индексируемые после изменения, будут использовать целочисленное скалярное квантованное представление int4 и HNSW (например, для запросов KNN). Это включает новые сегменты, созданные путем слияния ранее созданных сегментов.

resp = client.indices.put_mapping(
    index="my-index-000001",
    properties={
        "text_embedding": {
            "type": "dense_vector",
            "dims": 384,
            "index_options": {
                "type": "int4_hnsw"
            }
        }
    },
)
print(resp)
const response = await client.indices.putMapping({
  index: "my-index-000001",
  properties: {
    text_embedding: {
      type: "dense_vector",
      dims: 384,
      index_options: {
        type: "int4_hnsw",
      },
    },
  },
});
console.log(response);
PUT /my-index-000001/_mapping
{
    "properties": {
        "text_embedding": {
            "type": "dense_vector",
            "dims": 384,
            "index_options": {
                "type": "int4_hnsw"
            }
        }
    }
}

Векторы, индексированные до этого изменения, будут продолжать использовать тип flat (сырое представление float32 и поиск по силе грубой силы для запросов KNN).

Для обновления всех векторов до нового типа необходимо использовать переиндексацию или принудительное слияние.

Для отладки можно проверить, сколько сегментов (и документов) существует для каждого type с помощью API сегментов индекса.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/dense-vector.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API