Тип поля плотного вектора
Тип поля 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