База данных векторов: использование Elasticsearch для хранения и поиска векторных данных
База данных векторов: использование Elasticsearch для хранения и поиска векторных данных

База данных векторов: использование Elasticsearch для хранения и поиска векторных данных

1. Введение

  Elasticsearch поддерживается в версии 7.x. Векторный поиск[2]。 В процессе вычисления векторной функции,Линейное сканирование выполняется для всех совпадающих документов. поэтому,Ожидаемое время запроса увеличивается линейно с увеличением количества совпадающих документов. по этой причине,Рекомендуется использовать параметры запроса для ограничения количества совпадающих документов (аналогично логике вторичного поиска).,Используйте сначалаmatch queryСоответствующие документы получены.,Затем используйте векторную функцию для расчета релевантности документа).

  доступdense_vectorРекомендуемый метод — пройтиcosinessimilarity, dotProduct, Функция 1norm или l2norm. Однако обратите внимание, что каждый сценарий DSL может вызывать эти функции только один раз. Например, не используйте эти функции в цикле для вычисления сходства между вектором документа и несколькими другими векторами. Если эта функциональность требуется, эти функции можно переопределить, обратившись напрямую к значениям векторов.

2. Подготовка перед экспериментом

2.1 Создание векторного поля настройки индекса

  Создайте файл с поддержкой векторного поискаmapping,Тип поляdense_vector

Язык кода:javascript
копировать
// 7.x поддерживается dims Максимум 1024。
PUT index3
{
  "mappings": {
    "properties": {
      "my_vector": {
        "type": "dense_vector",
        "dims": 3
      },
      "my_text" : {
        "type" : "keyword"
      }
    }
  }
}

2.2 Запись данных

Язык кода:javascript
копировать
PUT index3/_doc/1
{
  "my_text" : "text1",
  "my_vector" : [0.5, 10, 6]
}

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

3. Функция векторного расчета

3.1 Косинусное сходство: cosineSimilarity

Функция cosinessimilarity вычисляет меру косинусного сходства между заданным вектором запроса и вектором документа.

Язык кода:javascript
копировать
POST index3/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "cosineSimilarity(params.queryVector, doc['my_vector'])+1.0",
        "params": {
          "queryVector": [-0.5, 10, 6]
        }
      }
    }
  }
}
  1. 1. ограничиватьscript_scoreПодсчитанное количество документов,Необходимо предоставить фильтр (запрос).
  2. 2. scriptСкрипт находится вcosineSimilarityдобавлено1.0,Чтобы не было отрицательных оценок.
  3. 3. Чтобы лучше использовать оптимизатор DSL, вы можете предоставить вектор запроса с помощью параметров.
  4. 4. Проверьте наличие пропущенных значений: если в документе нет значения для векторного поля, используемого для выполнения векторной функции.,выдаст ошибку。Можно использоватьdoc['my_vector'].size() == 0чтобы проверить, есть ли в документеmy_vectorзначение поля。Пример сценария:
Язык кода:javascript
копировать
"source": 
"
doc['my_vector'].size() == 0 ? 0 : 
cosineSimilarity(params.queryVector, 'my_vector')
"

  Если документdense_vectorПоле имеет векторные размеры, отличные от размера запроса.,Будет выброшено исключение.

3.2 Вычисление скалярного произведения: dotProduct

Функция dotProduct вычисляет метрику скалярного произведения между заданным вектором запроса и вектором документа.

Язык кода:javascript
копировать
POST index3/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": """
        double value = dotProduct(params.queryVector,doc['my_vector']);
        return sigmoid(1, Math.E, -value);
        """,
        "params": {
          "queryVector": [
            -0.5,
            10,
            6
          ]
        }
      }
    }
  }
}
  1. 1. Используйте стандартныйsigmoidфункция Предотвращает дроби от отрицательных значений。

3.3 Манхэттенское расстояние: l1norm

l1normфункция Вычисляет расстояние между заданным вектором запроса и вектором документа.L1расстояние(Манхэттенрасстояние)。

Язык кода:javascript
копировать
POST index3/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source":"1 / (1 + l1norm(params.queryVector, doc['my_vector']))",
        "params": {
          "queryVector": [-0.5, 10, 6]
        }
      }
    }
  }
}
  1. 1. Отличается от косинусного подобия, которое выражает сходство.,1normиl2normвыражатьрасстояниеилиразница。это означает,Чем больше похожи векторы,Зависит от1normиl2normфункция Чем ниже полученный балл。поэтому,Когда нам нужны похожие векторы, чтобы получить более высокие оценки,мы будем1normиl2normВыход。кроме того,Чтобы избежать деления на ноль, когда вектор документа точно соответствует запросу,К знаменателю добавил 1.

3.4 Евклидово расстояние: l2norm

Функция l2norm вычисляет расстояние L2 (евклидово расстояние) между заданным вектором запроса и вектором документа.

Язык кода:javascript
копировать
POST index3/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "1 / (1 + l2norm(params.queryVector, doc['my_vector']))",
        "params": {
          "queryVector": [
            -0.5,
            10,
            6
          ]
        }
      }
    }
  }
}

3.5 Пользовательская функция расчета

 Используйте функции для доступа к векторным значениям и настройки вычислений сходства векторных косинусов. Функция векторного поиска doc[].vectorValue в ES поддерживается, начиная с Elasticsearch версии 7.8.0, но не работает в ES 7.5.1 или версиях ниже 7.8.0.

 К векторным значениям можно получить прямой доступ через следующие функции:

  • doc[<field>].vectorValue – Возвращает значение вектора как массив чисел с плавающей запятой.
  • doc[<field>].magnitude – Возвращает размер вектора в виде числа с плавающей запятой (размер вектора не сохраняется для векторов, созданных до версии 7.5). Таким образом, эта функция будет пересчитываться каждый раз при ее вызове.
Язык кода:javascript
копировать
POST index3/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": """
          float[] v = doc['my_vector'].vectorValue;
          float vm = doc['my_vector'].magnitude;
          float dotProduct = 0;
          for (int i = 0; i < v.length; i++) {
            dotProduct += v[i] * params.queryVector[i];
          }
          return dotProduct / (vm * (float) params.queryVectorMag);
        """,
        "params": {
          "queryVector": [
            -0.5,
            10,
            6
          ],
          "queryVectorMag": 5.25357
        }
      }
    }
  }
}
Справочная ссылка

[1] TOC: База данных векторов: использование Elasticsearch для хранения и поиска векторных данных [2] Векторный поиск: https://github.com/elastic/elasticsearch/blob/e8c382f89553e3a7aaafa88a5934288c1192acdc/docs/reference/vectors/vector-functions.asciidoc

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.