Elasticsearch:对嵌套值进行高效排序
Elasticsearch: efficient sorting on nested values
我正在根据嵌套 key/value 结构中的值计算对 Elasticsearch (5.1.1) 的结果进行排序。
排序必须:
- 从多个嵌套结构中的给定键查找值
- 将这些值相互相乘
- 使用这个乘法作为排序的分数
我目前的工作正常,但它确实 slow/inefficient。由于上面 #2 中的计算,我制作了一个 Painless 脚本。我正在做的是:
- 遍历所有键以找到它们各自的匹配值
- 对于第一个匹配项,将值保存在一个变量中;对于后续匹配,将保存的值乘以当前值,并将其保存在上述变量中
我认为效率低下的原因是:
- 遍历所有嵌套项目(每个文档有很多,还有很多文档)
- 我正在使用
params['_source']
,它以速度慢着称。 AFAIK,我必须使用 params['_source']
来解决 Painless 中的嵌套值
现在问题来了:我怎样才能更有效地解决这个问题?我是完全以错误的方式解决这个问题,还是有办法不使用 params['_source']
?
我的映射(嵌套结构是"my_ratios"
):
{
"my_index": {
"mappings": {
"my_type": {
"properties": {
"a_value": {
"type": "long"
},
"my_ratios": {
"type": "nested",
"properties": {
"Key": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"Value": {
"type": "float"
}
}
}
}
}
}
}
}
嵌套 key/value 结构示例:
{
{
"Key": "Key1",
"Value": 0.4898
},
{
"Key": "Key2",
"Value": 0.14286
},
{
"Key": "Key3",
"Value": 6.12245
},
...
}
恐怕你唯一的选择是要么改造你的数据,要么有一份相关数据结构的副本来供你排序。
据我所知,Elasticsearch 从未打算在 params['_source']
上提高效率,而且您确实需要——正如您指出的那样——使用它从 Painless 访问嵌套对象。换句话说 - Elasticsearch 在对嵌套对象执行自定义操作时效率不高。
确保在满足要求后立即退出循环,以避免不必要的迭代 - 如果您还没有这样做,这可能会带来一些改进。
我正在根据嵌套 key/value 结构中的值计算对 Elasticsearch (5.1.1) 的结果进行排序。
排序必须:
- 从多个嵌套结构中的给定键查找值
- 将这些值相互相乘
- 使用这个乘法作为排序的分数
我目前的工作正常,但它确实 slow/inefficient。由于上面 #2 中的计算,我制作了一个 Painless 脚本。我正在做的是:
- 遍历所有键以找到它们各自的匹配值
- 对于第一个匹配项,将值保存在一个变量中;对于后续匹配,将保存的值乘以当前值,并将其保存在上述变量中
我认为效率低下的原因是:
- 遍历所有嵌套项目(每个文档有很多,还有很多文档)
- 我正在使用
params['_source']
,它以速度慢着称。 AFAIK,我必须使用params['_source']
来解决 Painless 中的嵌套值
现在问题来了:我怎样才能更有效地解决这个问题?我是完全以错误的方式解决这个问题,还是有办法不使用 params['_source']
?
我的映射(嵌套结构是"my_ratios"
):
{
"my_index": {
"mappings": {
"my_type": {
"properties": {
"a_value": {
"type": "long"
},
"my_ratios": {
"type": "nested",
"properties": {
"Key": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"Value": {
"type": "float"
}
}
}
}
}
}
}
}
嵌套 key/value 结构示例:
{
{
"Key": "Key1",
"Value": 0.4898
},
{
"Key": "Key2",
"Value": 0.14286
},
{
"Key": "Key3",
"Value": 6.12245
},
...
}
恐怕你唯一的选择是要么改造你的数据,要么有一份相关数据结构的副本来供你排序。
据我所知,Elasticsearch 从未打算在 params['_source']
上提高效率,而且您确实需要——正如您指出的那样——使用它从 Painless 访问嵌套对象。换句话说 - Elasticsearch 在对嵌套对象执行自定义操作时效率不高。
确保在满足要求后立即退出循环,以避免不必要的迭代 - 如果您还没有这样做,这可能会带来一些改进。