如何在Elasticsearch脚本中访问数组项

时间:2020-09-09 07:52:52

标签: elasticsearch

我的索引具有以下映射:

    "my_index": {
        "mappings": {
            "properties": {
                "medias": {
                    "properties": {
                        "media_id": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "media_type": {
                            "type": "long"
                        },
                        "variant": {
                            "properties": {
                                "height": {
                                    "type": "long"
                                },
                                "url": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                },
                                "width": {
                                    "type": "long"
                                }
                            }
                        },
                        "view_count": {
                            "type": "long"
                        }
                    }
                }
              
}

我想编写一个脚本来进行自定义评分,如下所示:

    // "_source": "content",
    "query": {
        "function_score": {
            "functions": [
                {
                    "script_score": {
                        "script": {
                            "source": " (doc.medias.size() == 0 || doc.medias.view_count.size() == 0 ? 0 : doc.medias.view_count.value) "
                        }
                    
                    }
                }
            ],
            "query": {
                "match": {
                    "content": something"
                }
            },
            "score_mode": "multiply"
        }
    }
}

但是我得到这个错误:

"caused_by": {
                        "type": "illegal_argument_exception",
                        "reason": "No field found for [medias] in mapping with types []"
                    }

我想我没有正确访问view_count属性。我怎样才能做到这一点?还有一件事:medias字段是一个数组,如果数组的大小超过1,则需要获取view_count中的最大值。我该怎么办?

1 个答案:

答案 0 :(得分:1)

一个好的开始!您快到了,只需访问这样的doc值即可得到所需的结果:

    {
      "script_score": {
        "script": {
          "source": " (doc['medias.view_count'].size() == 0 ? 0 : doc['medias.view_count'].value) "
        }
      }
    }

由于doc['medias.view_count']实际上是一个Java列表,因此,如果需要获取最大的视图计数,可以这样进行:

    {
      "script_score": {
        "script": {
          "source": " (doc['medias.view_count'].size() == 0 ? 0 : doc['medias.view_count'].stream().max(Long::compare).get()) "
        }
      }
    }