一尘不染

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

elasticsearch

我有两种文档类型,具有父子关系:

"myParent" : {
  "properties" : {
    "weight" : {
      "type" : "double"
    }
  }
}

"myChild" : {
  "_parent" : {
    "type" : "myParent"
  },
  "_routing" : {
    "required" : true
  }
}

weight字段将用于自定义评分/排序。直接针对父文档的此查询按预期工作:

{
  "query" : {
    "function_score" : {
      "script_score" : {
        "script" : "_score * doc['weight'].value"
      }                 
    }                                                                       
  }    
}

但是,当尝试通过has_parent查询对子文档进行类似评分时,出现错误:

{
  "query" : {
    "has_parent" : {
      "query" : {
        "function_score" : {                                                    
          "script_score" : {
            "script" : "_score * doc['weight'].value"
          }
        }
      },
      "parent_type" : "myParent",
      "score_type" : "score"
    }
  }
}

错误是:

QueryPhaseExecutionException [[myIndex] [3]:查询[过滤(ParentQuery
[myParent](过滤(功能评分(ConstantScore( : ), 函数=脚本[_score * DOC [
‘重量’]的值],则params [空]))
->缓存(_type:myParent)))->缓存(_type:myChild)],从[0],大小[10]:查询失败[无法执行上下文重写]];
嵌套:ElasticSearchIllegalArgumentException [在映射类型为[myChild]的[weight]中找不到字段];

ES似乎没有将评分功能应用于父级,然后将其结果传递给子级,而是试图将评分函数本身应用于子级,从而导致错误。

如果我不使用scorefor score_type,则不会发生错误,尽管结果得分是全部1.0,如记录所示。

我在这里想念什么?如何基于父字段以自定义评分查询这些子文档?


阅读 313

收藏
2020-06-22

共1个答案

一尘不染

我想说的是一个错误:myChild即使您在has_parent查询中,它仍将映射用作默认上下文。但是我不确定该错误将如何修复。正确地。

但是,您可以通过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"
    }
  }
}'

我开了一个问题,看是否可以解决此问题#4914

2020-06-22