Elasticsearch 基于日期的函数评分以错误的方式提升
Elasticsearch date based function scoring boosting the wrong way
我想根据文档的“最近”程度提高文档分数。我正在尝试使用 function_score
来执行此操作。这是我在名为 updated_at
:
的字段上执行此操作的示例
{
"function_score": {
"boost_mode": "sum",
"functions": [
{
"exp": {
"updated_at": {
"origin": "now",
"scale": "1h",
"decay": 0.01,
},
},
"weight": 1,
}
],
"query": query
},
}
我希望接近日期时间 now
的文档得分接近 1,接近 scale
的文档得分接近 decay
(如中所述docs)。因此,我使用 boost_mode
总和来保持原始文档分数,并根据 updated_at
值接近 now
的程度增加。 (此外,查询分数很有用,所以我宁愿加法也不愿乘法,这是默认值)。
为了测试这种情况,我创建了一个 returns 查询分数约为 2 的文档 (A)。然后我复制它 (B) 并将新文档的 updated_at
时间戳修改为一个小时过去了。
在这种情况下,我希望 (A) 的得分较高,而 (B) 的得分较低。但是,当我 运行 这种情况时,我得到的恰恰相反。 (B) 最终得分为 3,(A) 最终得分为 2。
我在这里误解了什么导致发生这种情况?我该如何修改我的功能分数来做我想做的事?
原来是时区问题。
我最终使用 explain API 来查看对分数有贡献的因素。这样做时,我注意到 origin
设置为 now
实际上与我在文档中设置的时区不同。
我通过在 elasticsearch 查询中手动提供 UTC 时间戳而不是使用 now
作为值来解决这个问题。
(如果有更好的方法,请告诉我)
我想根据文档的“最近”程度提高文档分数。我正在尝试使用 function_score
来执行此操作。这是我在名为 updated_at
:
{
"function_score": {
"boost_mode": "sum",
"functions": [
{
"exp": {
"updated_at": {
"origin": "now",
"scale": "1h",
"decay": 0.01,
},
},
"weight": 1,
}
],
"query": query
},
}
我希望接近日期时间 now
的文档得分接近 1,接近 scale
的文档得分接近 decay
(如中所述docs)。因此,我使用 boost_mode
总和来保持原始文档分数,并根据 updated_at
值接近 now
的程度增加。 (此外,查询分数很有用,所以我宁愿加法也不愿乘法,这是默认值)。
为了测试这种情况,我创建了一个 returns 查询分数约为 2 的文档 (A)。然后我复制它 (B) 并将新文档的 updated_at
时间戳修改为一个小时过去了。
在这种情况下,我希望 (A) 的得分较高,而 (B) 的得分较低。但是,当我 运行 这种情况时,我得到的恰恰相反。 (B) 最终得分为 3,(A) 最终得分为 2。
我在这里误解了什么导致发生这种情况?我该如何修改我的功能分数来做我想做的事?
原来是时区问题。
我最终使用 explain API 来查看对分数有贡献的因素。这样做时,我注意到 origin
设置为 now
实际上与我在文档中设置的时区不同。
我通过在 elasticsearch 查询中手动提供 UTC 时间戳而不是使用 now
作为值来解决这个问题。
(如果有更好的方法,请告诉我)