我有两种文档类型,具有父子关系:
"myParent" : { "properties" : { "weight" : { "type" : "double" } } } "myChild" : { "_parent" : { "type" : "myParent" }, "_routing" : { "required" : true } }
该weight字段将用于自定义评分/排序。直接针对父文档的此查询按预期工作:
weight
{ "query" : { "function_score" : { "script_score" : { "script" : "_score * doc['weight'].value" } } } }
但是,当尝试通过has_parent查询对子文档进行类似评分时,出现错误:
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,如记录所示。
score
score_type
1.0
我在这里想念什么?如何基于父字段以自定义评分查询这些子文档?
我想说的是一个错误:myChild即使您在has_parent查询中,它仍将映射用作默认上下文。但是我不确定该错误将如何修复。正确地。
myChild
但是,您可以通过type在完整的字段名称中包含名称来解决此问题:
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