Сходство [косинуса] не поддерживает векторы с нулевой величиной в эластичном поиске

Я пытался выполнить прием данных из моего поддельного набора данных в Elastic Search. Мой поддельный набор данных содержит много 0 векторов (0,0, ..., ) и получил ошибку о приеме нулевых векторов.

{'errors': True, 'took': 64, 'items': [{'create': {'_index': 'bdp-cus-feature-store-1.1-vector-p1', '_id': '5aeefc2e656b6f77c60af0d90f1280b52e298441d29a80c69321155aa9700438', 'status': 400, 'error': {'type': 'document_parsing_exception', 'reason': '[1:3931] failed to parse: The [cosine] similarity does not support vectors with zero magnitude. Preview of invalid vector: [0.0, 0.0, 0.0, 0.0, 0.0, ...]', 'caused_by': {'type': 'illegal_argument_exception', 'reason': 'The [cosine] similarity does not support vectors with zero magnitude. Preview of invalid vector: [0.0, 0.0, 0.0, 0.0, 0.0, ...]'}}}}

Я думал, что Elastic Search — это просто база данных, и меня смущает то, что прием 0 векторов не разрешен. Я пытался найти решение и выполнить поиск в Интернете, но не смог найти ни одного сообщения об этом или о том, как его решить. У кого-нибудь есть идеи? Большое спасибо.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
0
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Elasticsearch — это не просто база данных; помимо других возможностей, это также векторная база данных. Когда вы индексируете плотные векторы, Elasticsearch поддерживает специальную структуру данных, называемую графом Hierarchical Navigable Small World (HNSW). Эта структура обеспечивает быстрый приблизительный поиск k-ближайших соседей (kNN) во время поиска.

Расположение векторов в этом графе основано на сходстве между векторами. По умолчанию Elasticsearch использует для этой цели косинусное сходство. Как объяснено в этом https://stackoverflow.com/a/26703445/783043, сходство косинусов не имеет особого смысла для нулевых векторов, что приводит к тому, что Elasticsearch выдает ошибки относительно них.

Решением этой проблемы является либо переключение на другую меру сходства, либо вообще отказ от индексации поля, если вы не планируете по нему искать.

Решение 1:

DELETE test

PUT test
{
  "mappings": {
    "properties": {
      "vector": {
        "type": "dense_vector",
        "dims": 3,
        "similarity": "l2_norm"
      }
    }
  }
}

POST test/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "vector": [1, 5, -20]}
{ "index": { "_id": "2" } }
{ "vector": [0, 0, 0]}

Решение 2:

DELETE test

PUT test
{
  "mappings": {
    "properties": {
      "vector": {
        "type": "dense_vector",
        "dims": 3,
        "index": false
      }
    }
  }
}

POST test/_bulk?refresh=true
{ "index": { "_id": "1" } }
{ "vector": [1, 5, -20]}
{ "index": { "_id": "2" } }
{ "vector": [0, 0, 0]}

Другие вопросы по теме