执行此查询时,我使用的是elasticsearch 7.9.0版:
curl -XGET 'https:somehost:9200/index_name/_search' -H 'Content-Type: application/json' -d '{
"size": 10,
"query": {
"script_score": {
"query": {
"match_all": {}
},
"script": {
"source": "cosineSimilarity(params.query_vector, \u0027title_embed\u0027) + 1.0",
"params": {
"query_vector": [-0.19277021288871765, 0.10494251549243927,.......]}
}
}
}
}'
注:以下为 query_vector
是bert生成的768维向量。注: \u0027
单引号的unicode。
我得到了这个错误的回应:
"cosineSimilarity(params.query_vector, 'title_embed') + 1.0","
^---- HERE"],"script":"cosineSimilarity(params.query_vector, 'title_embed') +
1.0","lang":"painless","position":{"offset":38,"start":0,"end":58},"caused_by":
{"type":"class_cast_exception","reason":"class
org.elasticsearch.index.fielddata.ScriptDocValues$Doubles cannot be cast to class
org.elasticsearch.xpack.vectors.query.VectorScriptDocValues$DenseVectorScriptDocValues
(org.elasticsearch.index.fielddata.ScriptDocValues$Doubles is in unnamed module of loader 'app';
org.elasticsearch.xpack.vectors.query.VectorScriptDocValues$DenseVectorScriptDocValues is in
unnamed module of loader java.net.FactoryURLClassLoader @715fb77)"}}}]},"status":400}
尽管 title_embed
在索引Map中是elasticsearch的 dense_vector
输入,错误显示是双精度的,我不知道为什么?
以下是Map:
"mappings": {
"properties": {
"description": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"domain": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"link": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"pub_date": {
"type": "date"
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"title_embed": {
"type": "dense_vector",
"dims": 768
},
"description_embed": {
"type": "dense_vector",
"dims": 768
}
}
}
当我尝试使用python执行此查询时,收到相同的错误:
status_code, error_message, additional_info
elasticsearch.exceptions.RequestError: RequestError(400, 'search_phase_execution_exception', "class_cast_exception: class org.elasticsearch.index.fielddata.ScriptDocValues$Doubles cannot be cast to class org.elasticsearch.xpack.vectors.query.VectorScriptDocValues$DenseVectorScriptDocValues (org.elasticsearch.index.fielddata.ScriptDocValues$Doubles is in unnamed module of loader 'app'; org.elasticsearch.xpack.vectors.query.VectorScriptDocValues$DenseVectorScriptDocValues is in unnamed module of loader java.net.FactoryURLClassLoader @6d91790b)")
1条答案
按热度按时间4dc9hkyq1#
如果可能,检查变量的数量是否等于Map中的维数,即。
dims:768
“查询向量”中的值数是否等于768?我建议再次检查Map,通过运行以下命令查看Map是否良好:
另外,在传递“query\u vector”时,您可能遗漏了一个值。
我做了一个局部测试,但是向量有3维。
标题嵌入的Map为3,类型为“稠密向量”。
我在Map中吸收了一些数据,如下所示:
我尝试用上面提到的较低的向量维度复制您的查询:
注意:正如tom elias提到的,运行doc['title\u embed']可以工作,但是在7.9.0版本中不推荐使用。
一个小的建议是,当在索引中与Map一起接收数据时,是否可以通过减少向量维数来尝试使用较低的维数。如果维度数是5,那么检查Map中的“dim”值是否是5,同时将数据接收到索引和“query\u vector”中
如果这不起作用,我想可能有一个内部限制的数量被允许。
有用的链接:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/query-dsl-script-score-query.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html