我有 posts
索引,我想
a) 按日期过滤掉所有帖子,即只返回在给定日期之前创建的帖子 date
b) 应用 function_score
结果如何。
我提出了一个类似这样的问题:
get posts/_search
{
"query": {
"function_score": {
"query": {
"bool": {
"filter": [
{
"range": {
"created_at": {
"lte": "2020-09-12T17:23:00Z"
}
}
}
]
}
},
"functions": [
{
"field_value_factor": {
"field": "likes",
"factor": 0.1,
"modifier": "ln1p",
"missing": 1
}
}
],
"score_mode": "sum"
}
},
"from": 0,
"size": 10
}
然而,问题是ElasticSearch并没有对结果应用score,所有文档都有 0.0
分数。我可以通过将filter移到函数中来“欺骗”es,然后它就工作了,但是我觉得它不是最优的,你知道为什么上面的查询不会返回分数吗?
“作弊”查询的示例,该查询计算每个文档的分数:
get posts/_search
{
"query": {
"function_score": {
"functions": [
{
"filter": {
"range": {
"created_at": {
"lte": "2020-09-12T17:22:58Z"
}
}
},
"weight": 100
},
{
"gauss": {
"created_at": {
"origin": "2020-09-12T17:22:58Z",
"scale": "1h",
"decay": 0.95
}
}
},
{
"field_value_factor": {
"field": "likes",
"factor": 0.1,
"modifier": "ln1p",
"missing": 1
}
}
]
}
},
"from": 0,
"size": 10
}
1条答案
按热度按时间n3h0vuf21#
过滤器不影响分数。只有0或1。为了能够影响分数,你必须使用一个计算分数的函数(匹配,匹配短语,地理查询等等),你可以在文档中有更多关于上下文的细节
字段\u值\u因子会影响现有分数,但在第一次查询中,此阶段没有任何分数,因为它几乎与按相同数量排序相同。
在第二个查询中,根据文档的最新情况计算一个分数,然后用likes来影响它。这就是为什么它有效。