当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch无痛脚本按值获取嵌套字段?

朱保赫
2023-03-14
{
  "title": "Mr",
  "first_name": "Barry",
  "last_name": "White",
  "experiences": [
     {
       "name": "parachute",
       "values": {
           "last_year": 4,
           "older": 12
       }
    },
    {
       "name": "base jump",
       "values": {
           "last_year": 2,
           "older": 1
       }
    }
   ]
}

以下是我的查询的简化版本:

{
"query" :{
    "nested": {
        "path": "experiences",
        "query":{
            "function_score" : {
                "functions": [
                    {
                        "filter": {"term": { "experiences.name": "parachute"} },
                        "script_score" : {
                            "script" : {
                              "lang": "painless",
                              "inline": "_score * doc['experiences.values.older'].value" //Here I want to get the "older" value of "parachute": 12
                            }
                        }
                    }
                ]
             }

        }
    }
}
}

希望有办法解决这个...

提前感谢你的帮助

共有1个答案

杜烨伟
2023-03-14

我终于设法解决了这个问题,这要归功于官方elasticsearch IRC频道的一些帮助。我不得不稍微改变一下文档映射:

  • 删除“值”
  • 将“last_year”和“older”设置为每个经历的根值

就这样了。下面是最后一个查询:

{
    "query" :{
        "nested": {
            "path": "experiences",
            "query":{
                "function_score" : {
                    "query":{
                        "term": { "experiences.name": "parachute"}
                    },
                    "functions": [
                        {
                            "field_value_factor": {
                                "field": "experiences.older",
                                "factor": 1,
                                "missing": 1
                            }
                        },{
                            "field_value_factor": {
                                "field": "experiences.last_year",
                                "factor": 2,
                                "missing": 1

                            }
                        }
                    ],
                    "score_mode": "sum"
                }
            }
        }
    }
}
 类似资料:
  • 问题内容: 我刚开始使用ES,但仍然喜欢交易的技巧!!!我需要替换/覆盖嵌套对象类型的字段之一。这是示例文档: 映射以上文档: 我需要更新给定ref_name的计数字段值。例如,在上述情况下,如果 ref_name 是“ test1 ”,我希望新 计数 为 500 。我想出了下面的简单 脚本 来更改 计 数值,它可以正常执行而没有任何错误,但是我看不到该值正在更新。 以下是响应: 但是,当我看到该

  • 我想从特定字段中搜索关键字并返回文档。在这些文档之上,我希望遍历每个嵌套对象,并从选定文档的同一特定字段中再次搜索关键字。 如果关键字存在,则检查:如果布尔isCurrent = True,则设置isCurrent=0,并将该值追加到列表中;否则,如果isCurrent = False,则取当前日期时间的差值,结束日期时间,并获得以月为单位的值,并将该值追加到列表中。 最后,从每个文档的列表中获取

  • 我没有Java经验,我对elasticsearch无痛脚本语言有问题。(这个名字叫“无痛”,选得不好)。 对于下面的代码,我得到了错误: 无法应用 [ 我用(float) doc['newPrice']将它绑定为float 然后我改为<code>“Double price=((Double)doc['discountPrice'] 并收到: “无法从[双]铸造到[双]。” 有人可以帮助我,尝试了很

  • 问题内容: 我只想获取嵌套字段,但不能,因为它不是叶字段。 我在下面尝试过,但是无法匹配嵌套对象中的每个ID和名称。 结果: 这是我的预期结果: 问题答案: 如果您没有某个查询应以某种方式匹配嵌套字段,则可以这样进行: 如果您还有一个查询,并且想返回 匹配 的 嵌套文档,则 可以这样操作(使用):

  • 我用的是Elasticsearch 7.6 我在餐厅索引中有如下文档: 计数表示收到的订单数。 当客户在网站上按菜单名称搜索时,我想给几家餐馆中菜单数量高的餐厅打高分,并将其显示在搜索结果的顶部。 要做到这一点,似乎有必要知道无痛脚本中每个文档中匹配的菜单。 我想知道这是可能的。如果是这样,我该怎么做? 更新感谢大家的回答@jaspreet chahal 我做了这样的索引: 我想做的是在使用多重匹

  • 问题内容: 我想在每个更新时间将一个对象添加到字段中。 例如,我有一个文档: 下次,我想在测试字段中添加一个对象并保存旧对象。结果是: 如何实现? 编辑 我使用脚本: 但是,我得到了例外: 编辑 现在,我想添加一个字段以确保更新或插入对象。例如: 当我更新字段时,当id存在时,我将更新对象。相反,我将插入对象。 问题答案: 我建议尝试这样的脚本,该脚本在参数中带有两个参数。它将检查任何嵌套对象是否