Elasticsearch Script занимает слишком много времени - PullRequest
2 голосов
/ 22 апреля 2020

Я использую Script для сортировки результатов (или совпадений), возвращаемых 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 для сопоставления документов , Он возвращает мне много результатов (или совпадений), потому что он токенизируется с использованием Anangram, и для появления результатов требуется много времени (5 минут).

Вероятные причины: -

1) Безболезненный скрипт работает медленно.

2) Алгоритм, который я использую, медленный. (Я не могу изменить его, этот алгоритм, данный каким-то правительством или чем-то еще, я не знаю.)

3) Elasticsearch должен применить этот медленный алгоритм ко всем результатам (скажем, 400 000 из них), чтобы вычислить набрать и отсортировать их.

Чтобы решить вышеупомянутую проблему, я хочу сделать следующее:

1) Пусть Elasticsearch даст мне результаты с оценками, вычисленными с использованием Term Frequency и Inverse Term Frequency и все эти хорошие вещи, что действительно-очень быстро.

2) Я буду применять более медленный алгоритм для небольшого числа результатов (скажем, в TOP 10000) и снова отсортировать результаты.

Мой вопрос таков: "Есть ли способ, которым я могу применить Пересчет и Пересортировку только для небольшого фрагмента результатов, возвращаемых Elasticsearch внутри Elasticsearch?" Если нет, пожалуйста, предложите мне несколько идей или свои мысли!

1 Ответ

0 голосов
/ 22 апреля 2020

Если вы не используете _score в сценарии сортировки, вы можете использовать фильтр, результат которого кэшируется вasticsearch

Так что попробуйте следующий запрос и дайте мне знать:

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"
                        ]
                    }
                }
            ]
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...