我有两种文件类型,在父子关系中:
"myParent" : {
"properties" : {
"weight" : {
"type" : "double"
}
}
}
"myChild" : {
"_parent" : {
"type" : "myParent"
},
"_routing" : {
"required" : true
}
}
Run Code Online (Sandbox Code Playgroud)
该weight
字段用于自定义评分/排序.直接针对父文档的查询按预期工作:
{
"query" : {
"function_score" : {
"script_score" : {
"script" : "_score * doc['weight'].value"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当尝试使用has_parent
查询对子文档进行类似评分时,我收到错误:
{
"query" : {
"has_parent" : {
"query" : {
"function_score" : {
"script_score" : {
"script" : "_score * doc['weight'].value"
}
}
},
"parent_type" : "myParent",
"score_type" : "score"
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误是:
QueryPhaseExecutionException [[myIndex] [3]:查询[过滤(ParentQuery [myParent](过滤(功能评分(ConstantScore( :),功能=脚本[_score*DOC [ '重量']的值],则params [空])). - > cache(_type:myParent))) - > cache(_type:myChild)],从[0]开始,大小[10]:查询失败[无法执行上下文重写]]; 嵌套:ElasticSearchIllegalArgumentException [在使用类型[myChild]进行映射时找不到[weight]的字段];
似乎不是将评分函数应用于父级,然后将其结果传递给子级,ES试图将评分函数本身应用于子级,从而导致错误.
如果我不使用score
的score_type
,不会发生错误,虽然结果分数都那么所有1.0
,如记录.
我在这里错过了什么?如何使用基于父字段的自定义评分查询这些子文档?
我想说的是一个错误:它使用myChild
映射作为默认上下文,即使您在has_parent
查询中.但我不确定这个bug有多容易修复.正常.
但是,您可以通过type
在完整字段名称中包含名称来解决此问题:
curl -XGET "http://localhost:9200/t/myChild/_search" -d'
{
"query": {
"has_parent": {
"query": {
"function_score": {
"script_score": {
"script": "_score * doc[\"myParent.weight\"].value"
}
}
},
"parent_type": "myParent",
"score_type": "score"
}
}
}'
Run Code Online (Sandbox Code Playgroud)
我已经打开了一个问题,看看我们是否可以修复#4914