gpt4 book ai didi

performance - 在 Elasticsearch 中使用 function_score 时,过滤器是在 function_score 对象内部还是外部有关系吗?

转载 作者:行者123 更新时间:2023-12-02 23:17:11 24 4
gpt4 key购买 nike

我正在查看一些旧代码以及是否有必要对其进行重构以提高性能。

想法是......使用function_score,您将一个函数应用于要返回的所有文档,因此,如果您只能在需要的文档上运行这些函数,那就更好了。

目前这样做的方式有点像这样(我已经简化了这里讨论的查询):

{
"query": {
"bool": {
"must": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"gauss": {
"updated_at": {
"origin": "now",
"scale": "7d",
"offset": "2d",
"decay": 0.5
}
}
}
]
}
},
"filter": [
{
"bool": {
"must": [
{
"term": {
"indexed": true
}
}
],
"must_not": [
{
"terms": {
"sale_stage": [
"on_hold",
"withdrawn",
"off_market"
]
}
}
],
}
}
]
}
},
"sort": [
"_score",
"_uid"
],
}

查询的内容并不重要。重要的是在函数分数之外有过滤器。

查询运行良好,并返回正确的数据。但是,我是否认为评分函数正在索引中的所有文档上运行然后被过滤,或者 ES 足够聪明来优化这里,因为它知道我想要一组过滤的数据?

换句话说,我可以将查询保留原样,或者应该变成这样:
{
"query": {
"bool": {
"must": {
"function_score": {
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": [
{
"bool": {
"must": [
{
"term": {
"indexed": true
}
}
],
"must_not": [
{
"terms": {
"sale_stage": [
"on_hold",
"withdrawn",
"off_market"
]
}
}
]
}
}
]
}
},
"functions": [
{
"gauss": {
"updated_at": {
"origin": "now",
"scale": "7d",
"offset": "2d",
"decay": 0.5
}
}
}
]
}
}
}
},
"sort": [
"_score",
"_uid"
],
}

在第二个示例中,查询的意图是相同的,但我已将所有过滤转移到评分函数中。原因是,如果我有一个非常昂贵的功能(比如地理间距的东西),我不想在每个文档上运行它。

我是否需要进行这个小的重构,还是因为 ES 对此进行了优化而没有必要?

最佳答案

您可以将过滤器留在 function_score 之外询问。这个想法是,如果你有几个 function_score查询,过滤只进行一次,然后所有的函数分数都在过滤后的数据集上运行。

另外,如果除了 function_score 之外还有聚合查询,然后绝对让过滤器在外面,以便也可以在减少的文档集上计算聚合。过滤器都是关于减少需要运行昂贵计算的文档集。

关于performance - 在 Elasticsearch 中使用 function_score 时,过滤器是在 function_score 对象内部还是外部有关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53374292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com