Плотный векторный массив и косинусное сходство - PullRequest
1 голос
/ 23 апреля 2020

Я хотел бы сохранить массив dense_vector в своем документе, но это не работает, как для других типов данных, например.

PUT my_index
{
  "mappings": {
    "properties": {
      "my_vectors": {
        "type": "dense_vector",
        "dims": 3  
      },
      "my_text" : {
        "type" : "keyword"
      }
    }
  }
}

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

возвращает:

'1 document(s) failed to index.',
    {'_index': 'my_index', '_type': '_doc', '_id': 'some_id', 'status': 400, 'error': 
      {'type': 'mapper_parsing_exception', 'reason': 'failed to parse', 'caused_by': 
        {'type': 'parsing_exception', 
         'reason': 'Failed to parse object: expecting token of type [VALUE_NUMBER] but found [START_ARRAY]'
        }
      }
    }

Как мне этого добиться? Разные документы будут иметь различное количество векторов, но не более нескольких.

Кроме того, я бы хотел запросить его, выполнив cosineSimilarity для каждого значения в этом массиве. Приведенный ниже код показывает, как я обычно делаю это, когда у меня есть только один вектор в do c.

"script_score": {
    "query": {
        "match_all": {}
    },
    "script": {
        "source": "(1.0+cosineSimilarity(params.query_vector, doc['my_vectors']))",
        "params": {"query_vector": query_vector}
    }
}

В идеале, я хотел бы получить самое близкое сходство или среднее значение.

1 Ответ

0 голосов
/ 23 апреля 2020

Тип данных dense_vector предназначен для

хранения плотных векторов со значениями float (из документации ) .... Поле diff_vector равно однозначное поле .

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

Нет обходного пути :(

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...