6

对于我的 ElasticSearch 查询之一,我想定义一个函数得分并按其排序。函数 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"
        }
    }
}

到目前为止一切顺利,这工作正常。现在问题来了:接下来,每个文档都会有一个boost 值数组

"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]...

有任何想法吗?

4

1 回答 1

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

于 2013-11-07T16:55:26.537 回答