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

标签 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的最大值。我怎样才能做到这一点?

最佳答案

伟大的开始!您快要准备好了,您只需要访问doc值,就可以得到所需的结果:

    {
      "script_score": {
        "script": {
          "source": " (doc['medias.view_count'].size() == 0 ? 0 : doc['medias.view_count'].value) "
        }
      }
    }
由于doc['medias.view_count']实际上是Java列表,因此,如果需要获取最大的 View 计数,可以这样进行:
    {
      "script_score": {
        "script": {
          "source": " (doc['medias.view_count'].size() == 0 ? 0 : doc['medias.view_count'].stream().max(Long::compare).get()) "
        }
      }
    }

关于elasticsearch - 如何在Elasticsearch脚本中访问数组项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63807096/

相关文章:

elasticsearch - 嵌套字段上的ElasticSearch聚合

elasticsearch - 如何在 logstash conf 文件中使用包含?

elasticsearch - 获取所有文档中最常用的 100 个三词短语

elasticsearch - 从 Elasticsearch 脚本访问记录器

c# - 调用SourceInclude而不手动指定所有属性

node.js - 通过NodeJS客户端创建时间戳

java - 在生产环境中使用带有Elasticsearch alpha 3版本的Hibernate Search有什么危险?

django - 干草堆中的索引分析器与查询分析器-Elasticsearch?

java - 通过curl 的Elasticsearch REST api 无法从java.runtime.exec 运行

javascript - 如何使用 ElasticSearch 索引源代码