Elasticsearch脚本排序时间过长

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch脚本排序时间过长相关的知识,希望对你有一定的参考价值。

我正在使用脚本对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。 的匹配文档。它给我返回了很多结果(或匹配),因为它是tokenized使用Anangram和它需要很多时间(5分钟)的结果出现。

原因可能是:---------------------------------。

1) 无痛脚本运行缓慢。

2) 我使用的算法很慢(我不能改变它,这个算法是由政府或其他什么机构给出的,我不知道)。

3)Elasticsearch要对所有的结果(比如40万个)应用这个慢的算法来计算分数和排序。

为了解决上述问题,我想做的是

1)让Elasticsearch给我的结果与分数计算,使用 术语频率逆项频率 和所有的好东西,这是真的非常快。

2) 我将在少量的结果上应用较慢的算法(比如TOP 10,000),然后再次对结果进行排序。

我的问题是 "有没有一种方法可以让我在Elasticsearch内部只对Elasticsearch返回的一小块结果应用Re-Scoring和Re-Sorting?" 如果没有,请给我提出一些想法或你的想法!

答案

如果你不使用 _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脚本排序时间过长的主要内容,如果未能解决你的问题,请参考以下文章

elasticsearch实现简单的脚本排序(script sort)

elasticsearch代码片段,及工具类SearchEsUtil.java

[ElasticSearch]painless脚本使用方式及性能比较

Elasticsearch 评分排序

Elasticsearch--搜索

PHP - 停止并捕获耗时过长的代码