我正在研究用特征向量进行文档检索。因此,我使用一个具有余弦相似性的脚本分数查询。我的查询如下所示:
"query": {
"script_score": {
"query": {
"match_all": {}
},
"script": {
"lang":"painless",
"source": """
def m1 = doc['mask'].value;
def m2 = params.queryMask;
def c = 1;
def penalty = 1.0/params.queryVector.size(); //TODO: finetune penalty
ArrayList qeffective = new ArrayList();
for(int i; i < m1.length(); i++) {
if (m1.charAt(i) == '0'.charAt(0) || m2.charAt(i) == '0'.charAt(0)) {
qeffective.add(params._source['gpd-array'][i]);
c = c + penalty;
}else{
qeffective.add(params.queryVector[i]);
}
}
if (doc['id'].value == 90) {
Debug.explain((cosineSimilarity(qeffective, 'gpd')/c + 1.0)* doc['score'].value);
}
return (cosineSimilarity(qeffective, 'gpd')/c + 1.0)* doc['score'].value;
""",
"params": {
"queryVector": list(featurevector),
"queryMask": maskstr
}
}
}
}
debug会给我一个id=90的1.82的doc评分。
error:
root_cause
type:script_exception
reason:runtime error
painless_class:java.lang.Double
to_string:1.8278556404440713
java_class:java.lang.Double
但返回的文档评分显示文档90的评分为1.13分:
[(63, 1.6319464), (44, 1.6319138), (64, 1.631628), (67, 1.5568193), (79, 1.5566542), (71, 1.5565666), (82, 1.5565665), (49, 1.5564724), (68, 1.5563483), (72, 1.5560957), (85, 1.5357368), (50, 1.4558233), (48, 1.4343897), (62, 1.3008306), (86, 1.2138408), (78, 1.2138035), (81, 1.2130693), (87, 1.2129115), (88, 1.1383896), (90, 1.1382267), (84, 1.1372657), (89, 1.1372185), (77, 1.1170079), (66, 1.1162529), (80, 1.1162283), (70, 1.1153287), (83, 1.042699)]
其他值的得分也不一致。这是脚本\分数查询的预期行为吗?为什么这两个结果不同?返回分数时是否有任何标准化或缩放?
第二个问题:从验证的DOC90必须比DOC63好。这是否意味着分数越低意味着比赛越接近?我试图在api等中查找这些问题,但没有找到关于脚本分数函数属性的表达性文档。
你好,克里斯蒂安
暂无答案!
目前还没有任何答案,快来回答吧!