Elasticsearch поддерживается в версии 7.x. Векторный поиск[2]。 В процессе вычисления векторной функции,Линейное сканирование выполняется для всех совпадающих документов. поэтому,Ожидаемое время запроса увеличивается линейно с увеличением количества совпадающих документов. по этой причине,Рекомендуется использовать параметры запроса для ограничения количества совпадающих документов (аналогично логике вторичного поиска).,Используйте сначала
match query
Соответствующие документы получены.,Затем используйте векторную функцию для расчета релевантности документа).доступ
dense_vector
Рекомендуемый метод — пройтиcosinessimilarity, dotProduct, Функция 1norm или l2norm. Однако обратите внимание, что каждый сценарий DSL может вызывать эти функции только один раз. Например, не используйте эти функции в цикле для вычисления сходства между вектором документа и несколькими другими векторами. Если эта функциональность требуется, эти функции можно переопределить, обратившись напрямую к значениям векторов.
Создайте файл с поддержкой векторного поиска
mapping
,Тип поляdense_vector
。
// 7.x поддерживается dims Максимум 1024。
PUT index3
{
"mappings": {
"properties": {
"my_vector": {
"type": "dense_vector",
"dims": 3
},
"my_text" : {
"type" : "keyword"
}
}
}
}
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]
}
Функция cosinessimilarity вычисляет меру косинусного сходства между заданным вектором запроса и вектором документа.
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]
}
}
}
}
}
script_score
Подсчитанное количество документов,Необходимо предоставить фильтр (запрос).script
Скрипт находится вcosineSimilarity
добавлено1.0,Чтобы не было отрицательных оценок.doc['my_vector'].size() == 0
чтобы проверить, есть ли в документеmy_vector
значение поля。Пример сценария:"source":
"
doc['my_vector'].size() == 0 ? 0 :
cosineSimilarity(params.queryVector, 'my_vector')
"
Если документ
dense_vector
Поле имеет векторные размеры, отличные от размера запроса.,Будет выброшено исключение.
Функция dotProduct вычисляет метрику скалярного произведения между заданным вектором запроса и вектором документа.
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
]
}
}
}
}
}
sigmoid
функция Предотвращает дроби от отрицательных значений。
l1norm
функция Вычисляет расстояние между заданным вектором запроса и вектором документа.L1расстояние(Манхэттенрасстояние)。
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]
}
}
}
}
}
1norm
иl2norm
выражатьрасстояниеилиразница。это означает,Чем больше похожи векторы,Зависит от1norm
иl2norm
функция Чем ниже полученный балл。поэтому,Когда нам нужны похожие векторы, чтобы получить более высокие оценки,мы будем1norm
иl2norm
Выход。кроме того,Чтобы избежать деления на ноль, когда вектор документа точно соответствует запросу,К знаменателю добавил 1.Функция l2norm вычисляет расстояние L2 (евклидово расстояние) между заданным вектором запроса и вектором документа.
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
]
}
}
}
}
}
Используйте функции для доступа к векторным значениям и настройки вычислений сходства векторных косинусов. Функция векторного поиска doc[].vectorValue в ES поддерживается, начиная с Elasticsearch версии 7.8.0, но не работает в ES 7.5.1 или версиях ниже 7.8.0.
К векторным значениям можно получить прямой доступ через следующие функции:
doc[<field>].vectorValue
– Возвращает значение вектора как массив чисел с плавающей запятой.doc[<field>].magnitude
– Возвращает размер вектора в виде числа с плавающей запятой (размер вектора не сохраняется для векторов, созданных до версии 7.5). Таким образом, эта функция будет пересчитываться каждый раз при ее вызове.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