elasticsearch脚本使用稠密向量查询余弦相似度时出现“class\u cast\u exception”错误

gopyfrb3  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(698)

执行此查询时,我使用的是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)")
4dc9hkyq

4dc9hkyq1#

如果可能,检查变量的数量是否等于Map中的维数,即。 dims:768 “查询向量”中的值数是否等于768?
我建议再次检查Map,通过运行以下命令查看Map是否良好:

GET index_name/_mapping

另外,在传递“query\u vector”时,您可能遗漏了一个值。
我做了一个局部测试,但是向量有3维。
标题嵌入的Map为3,类型为“稠密向量”。
我在Map中吸收了一些数据,如下所示:

POST /index_name/_doc
{
  "title_embed": [10.01,15,15]
}

我尝试用上面提到的较低的向量维度复制您的查询:

{
"size": 10,
    "query": {
        "script_score": {
            "query": {
                "match_all": {}
            },
            "script": {
                "source": "cosineSimilarity(params.query_vector,'title_embed') + 1.0",
                "params": {
                    "query_vector": [-0.19277021288871765, 0.10494251549243927,12.202022]

                }
            }
        }
    }
}

注意:正如tom elias提到的,运行doc['title\u embed']可以工作,但是在7.9.0版本中不推荐使用。
一个小的建议是,当在索引中与Map一起接收数据时,是否可以通过减少向量维数来尝试使用较低的维数。如果维度数是5,那么检查Map中的“dim”值是否是5,同时将数据接收到索引和“query\u vector”中

"query_vector": [12,-1020.02000,10,-5.0000,2]

如果这不起作用,我想可能有一个内部限制的数量被允许。
有用的链接: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

相关问题