当前位置: 首页 > 面试题库 >

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

林运浩
2023-03-14
问题内容

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

"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,如记录所示。

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


问题答案:

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



 类似资料:
  • 向弹性搜索发送post请求以下是post数据 作为格式错误的查询获取响应 } 从以下链接阅读文档:https://www.elastic.co/guide/en/elasticsearch/reference/5.4/query-dsl-havs-child-query.html Elasticsearch版本:5.4

  • 我对Groovy很陌生,我想从主groovy脚本中的另一个groovy脚本中导入一个类。我已经看到了这篇文章。但是由于环境限制,我不能使用GroovyClassLoader之类的函数或导入任何库/框架。我唯一的可能性是使用评估方法。 我试过这个: 主脚本(评估不会抛出任何错误) Csvreader脚本 但是,我需要通过evaluate调用传递参数(并将方法移到类之外),或者需要创建类的实例。不幸的

  • 我在ElasticSearch有索引。其中的文档具有重复的字段值。在查询结果中,我需要删除所有重复项,并且只获得不同的值。例如: PUT localhost:9200/人 POST localhost:9200/人/人 我试图通过字段“name”删除重复的术语聚合,但它不起作用。 获取localhost:9200/person/person/_search 结果: 聚合应用于name=“marry

  • 问题内容: 我参与了一个将项目从Oracle迁移到MySQL的项目。在Oracle中,当通过命令行运行批处理时,我能够创建一个引用或包含其他外部SQL脚本文件的SQL脚本。我有一个名为CreateAllTables.sql的脚本,在内部看起来像这样: 我已经知道MySQL命令行“源”命令,但是我的目标是通过一个命令行调用来调用一个包含其他脚本的主.sql脚本文件,如下所示: 所以我的问题是我该如何

  • null null 结果(只是基于我的例子): 我们不需要在每个模块中添加相同的代码行。 大多数项目只与依赖项列表有区别。 我试图用Gralde KTS复制同样的东西,并收到以下困难: null null 其他链接: 插件应用的Gradle KTS问题。 共享常数提取的Gradle KTS问题。

  • 问题内容: 假设我创建了一个像这样的文档: 我可以使用GET / idx / type / 1检索文档: 现在,我想检查字段“ the_field”是否包含值2。我知道我可以使用term子句,但是我需要使用过滤器脚本检查它,因此我尝试了: 并没有结果: 为了测试我的mevl脚本语法是否正确,我尝试这样做: 并获得正确的结果: 我究竟做错了什么? 我认为doc [‘the_field’]。value