Elasticsearch 脚本排序耗时太长
Elasticsearch Script sort taking too long
我正在使用脚本对 Elasticsearch 返回的结果(或匹配项)进行排序。
查询看起来像这样。
GET trademark7/_search
{
"size" :20,
"track_scores": true,
"stored_fields": [
"_source"
],
"sort": {
"_script":{
"type" : "number",
"script" : {
"id": "algo_for_sorting",
"params":{
"query":"linkedin"
}
},
"order" : "desc"
}
},
"query" : {
"bool": {
"should": [
{
"match": {
"tm_applied_for_phonetic": {
"query": "linkedin"
}
}
},
{
"match": {
"tm_applied_for_anan" : {
"query" : "linkedin"
}
}
}
]
}
}
}
问题是:-
只要我使用字段 tm_applied_for_anan 来匹配文档。它 returns 我得到了很多结果(或匹配项),因为它是使用 Anangram 标记化的,并且需要很长时间(5 分钟)才能显示结果。
原因可能是:-
1)无痛脚本运行慢。
2) 我使用的算法很慢。 (我不能改变它,这个算法是某个政府什么的,我不知道。)
3) Elasticsearch 必须将这种缓慢的算法应用于所有结果(比如 400,000 个)以计算分数并对它们进行排序。
要解决上述问题,我想做的是
1) 让 Elasticsearch 给我使用 Term Frequency 和 Inverse Term Frequency 计算得分的结果以及所有这些好东西,这真的非常快。
2) 我将对少量结果(比如前 10,000 个)应用较慢的算法,然后再次对结果进行排序。
我的问题是 "Is there a way i can apply Re-Scoring and Re-Sorting for only a small chunk of the results returned by Elasticsearch inside Elasticsearch?" 如果不是,请给我一些想法或您的想法!
如果您不在排序脚本中使用 _score
,您可以使用过滤器,其结果缓存在 elasticsearch
所以请尝试以下查询并告诉我:
GET trademark7/_search
{
"size": 20,
"track_scores": true,
"stored_fields": [
"_source"
],
"sort": {
"_script": {
"type": "number",
"script": {
"id": "algo_for_sorting",
"params": {
"query": "linkedin"
}
},
"order": "desc"
}
},
"query": {
"bool": {
"filter": [
{
"multi_match": {
"query": "linkedin",
"fields": [
"tm_applied_for_phonetic",
"tm_applied_for_anan"
]
}
}
]
}
}
}
我正在使用脚本对 Elasticsearch 返回的结果(或匹配项)进行排序。
查询看起来像这样。
GET trademark7/_search
{
"size" :20,
"track_scores": true,
"stored_fields": [
"_source"
],
"sort": {
"_script":{
"type" : "number",
"script" : {
"id": "algo_for_sorting",
"params":{
"query":"linkedin"
}
},
"order" : "desc"
}
},
"query" : {
"bool": {
"should": [
{
"match": {
"tm_applied_for_phonetic": {
"query": "linkedin"
}
}
},
{
"match": {
"tm_applied_for_anan" : {
"query" : "linkedin"
}
}
}
]
}
}
}
问题是:-
只要我使用字段 tm_applied_for_anan 来匹配文档。它 returns 我得到了很多结果(或匹配项),因为它是使用 Anangram 标记化的,并且需要很长时间(5 分钟)才能显示结果。
原因可能是:-
1)无痛脚本运行慢。
2) 我使用的算法很慢。 (我不能改变它,这个算法是某个政府什么的,我不知道。)
3) Elasticsearch 必须将这种缓慢的算法应用于所有结果(比如 400,000 个)以计算分数并对它们进行排序。
要解决上述问题,我想做的是
1) 让 Elasticsearch 给我使用 Term Frequency 和 Inverse Term Frequency 计算得分的结果以及所有这些好东西,这真的非常快。
2) 我将对少量结果(比如前 10,000 个)应用较慢的算法,然后再次对结果进行排序。
我的问题是 "Is there a way i can apply Re-Scoring and Re-Sorting for only a small chunk of the results returned by Elasticsearch inside Elasticsearch?" 如果不是,请给我一些想法或您的想法!
如果您不在排序脚本中使用 _score
,您可以使用过滤器,其结果缓存在 elasticsearch
所以请尝试以下查询并告诉我:
GET trademark7/_search
{
"size": 20,
"track_scores": true,
"stored_fields": [
"_source"
],
"sort": {
"_script": {
"type": "number",
"script": {
"id": "algo_for_sorting",
"params": {
"query": "linkedin"
}
},
"order": "desc"
}
},
"query": {
"bool": {
"filter": [
{
"multi_match": {
"query": "linkedin",
"fields": [
"tm_applied_for_phonetic",
"tm_applied_for_anan"
]
}
}
]
}
}
}