elasticsearch:脚本分数查询的顺序和内部处理

fv2wmkja  于 2021-06-09  发布在  ElasticSearch
关注(0)|答案(0)|浏览(264)

我正在研究用特征向量进行文档检索。因此,我使用一个具有余弦相似性的脚本分数查询。我的查询如下所示:

"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等中查找这些问题,但没有找到关于脚本分数函数属性的表达性文档。
你好,克里斯蒂安

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题