对于我的一个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]...
有什么想法吗?
答案 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