【发布时间】:2018-11-19 20:09:22
【问题描述】:
我正在查看一些旧代码,以及是否有必要对其进行重构以提高性能。
我们的想法是......使用 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 对此进行了优化而没有必要?
【问题讨论】: