包含脚本化function_score的has_parent查询出现问题

Pau*_*ora 3 elasticsearch

我有两种文件类型,在父子关系中:

"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试图将评分函数本身应用于子级,从而导致错误.

如果我不使用scorescore_type,不会发生错误,虽然结果分数都那么所有1.0,如记录.

我在这里错过了什么?如何使用基于父字段的自定义评分查询这些子文档?

DrT*_*ech 6

我想说的是一个错误:它使用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