在script_score中访问数组

时间:2013-11-06 21:44:34

标签: elasticsearch

对于我的一个ElasticSearch查询,我想定义一个function score并按它排序。功能分数采用计算得分并为其添加提升值。每个文档的增强值都存储在数字字段中。

像这样:

{
    "from": 0,
    "size": 10,
    "query": {
        "function_score": {
            "functions": [
                {
                    "script_score": {
                        "script": "_score + doc['boostFactor'].value"
                    }
                }
            ],
            "query": {
                "filtered": {
                    "query": {
                        "query_string": {
                            "query": "search for this!"
                        }
                    }
                }
            },
            "boost_mode": "replace"
        }
    }
}

到目前为止一切顺利,这很好。现在问题出在今后:每个文档都有一个数组的提升值:

"boostFactor": [ 0, 0.5, 1, 3 ]

在启动查询时,我希望脚本得分能够根据预定义的索引选择数组的特定元素。所以让我们说index = 2,然后脚本得分可能看起来像这样:

                "script_score": {
                    "script": "_score + doc['boostFactor'][2].value"
                }

不幸的是,ElasticSearch不接受这个:

...Query Failed [Failed to execute main query]]; 
nested: CompileException[[Error: unexpected token in constructor]...

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

doc['boostFactor'].value返回单个值。要获取整个数组,请使用doc['boostFactor'].values;然后你可以按照你的期望在数组中获得一个特定的索引:

            {
                "script_score": {
                    "script": "_score + doc['boostFactor'].values[2]"
                }
            }

有关详细信息,请参阅Elasticsearch文档的脚本部分:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html