Практика оптимизации запросов Elasticsearch (1)
Практика оптимизации запросов Elasticsearch (1)
Язык кода:js
копировать
#Пример запроса пользователя
ПОЛУЧИТЬ index_v1/_search
{
  «от»: 0,
  «размер»: 10,
  "запрос": {
    "бул": {
      "нельзя": [
        {
          "бул": {
            "должен": [
              {
                "бул": {
                  "должен": [
                    {
                      "существует": {
                        "поле": "deleted_at",
                        "ускорение": 1
                      }
                    }
                  ],
                  «adjust_pure_negative»: правда,
                  "ускорение": 1
                }
              },
              {
                "срок": {
                  "удалено": {
                    «значение»: правда,
                    "ускорение": 1
                  }
                }
              }
            ],
            «adjust_pure_negative»: правда,
            "minimum_should_match": "1",
            "ускорение": 1
          }
        }
      ],
      «adjust_pure_negative»: правда,
      "ускорение": 1
    }
  },
  «версия»: правда,
  "сортировать": [
    {
      "создано_at": {
        "заказ": "описание"
      }
    }
  ],
  "агрегации": {
    "groupCurrency": {
      "условия": {
        "field": "order_currency",
        «размер»: 10,
        «min_doc_count»: 1,
        «shard_min_doc_count»: 0,
        «show_term_doc_count_error»: ложь,
        "заказ": [
          {
            "_count": "дескриптор"
          },
          {
            "_key": "по возрастанию"
          }
        ]
      },
      "агрегации": {
        "общий": {
          "value_count": {
            "поле": "идентификатор"
          }
        },
        "PaymentAmountTotal": {
          "сумма": {
            "field": "pay_amount"
          }
        },
        "actualPaymentAmountTotal": {
          "сумма": {
            "field": "actual_paid_amount"
          }
        },
        "serviceFeeTotal": {
          "сумма": {
            "field": "service_fee"
          }
        },
        "couponAmountTotal": {
          "сумма": {
            "field": "order_platform_coupon_discount"
          }
        }
      }
    }
  }
}

DSL-анализ:

Индекс пользователя — это индекс сценария обновления, который будет генерировать определенное количество сегментов doc.deleted и других.

В логическом запросе пользователь выполняет фильтрацию данных, чтобы определить, должно ли существовать поле delete_at или значение удаленного поля истинно, и отменяет must_not в наборе результатов. В то же время указывается «minimum_should_match»: «1», чтобы ограничить одновременное выполнение двух предложений в этом логическом запросе.

Тип поля Aggregations в основном Scaled_float, а Scaling_factor установлен на 100.

Тип Scaled_float — это тип данных, масштабируемый на основе чисел длинного типа.

Преимущества этого типа: он позволяет более точно считать десятичные дроби и экономить дисковое пространство, поскольку целые числа легче сжимать, чем числа с плавающей запятой;

Необходимо указать коэффициент масштабирования. При индексировании ES исходное значение будет умножено на коэффициент масштабирования и округлено для получения нового значения. Это новое значение сохраняется внутри ES, но возвращаемый результат по-прежнему является исходным значением. Преимущество использования коэффициентов масштабирования заключается в том, что целые числа легче сжимать, чем типы с плавающей запятой, что позволяет экономить дисковое пространство.

Уведомление: Атрибут scaling_factor доступен только для типа данных Scaled_float. Не используйте этот атрибут для других типов.

Например: значение поля a равно 0,1. Если тип поля a установлен на Scaled_float, а Scaling_factor установлен на 100, значение будет сохранено как целое число 0,1*100 во время хранения.

Используйте профиль для анализа времени запроса,В основном все вBooleanQueryиaggregationsэтап,Фаза агрегирования занимает много времени; в основном много времени занимают подсчет и суммирование.

Поля, используемые при агрегировании, не имеют типов ключевых слов, поэтому не возникает проблем с медленным выполнением запросов или снижением производительности, вызванным слишком большим количеством агрегаций из-за полей с высокой кардинальностью.

Примечание о глобальных порядковых номерах для полей с высокой мощностью:

Глобальный порядковый номер используется для выполнения агрегирования терминов в поле ключевого слова; es не знает, какие поля будут использоваться/не использоваться для агрегирования терминов, поэтому глобальный порядковый номер можно загрузить в память, когда это необходимо, определив при сопоставлении неожиданный глобальный номер = true; введите таким образом Глобальный порядковый номер будет загружен во время обновления;

Точки оптимизации:

1. Рекомендуется использовать тип ключевого слова для длинного типа при сопоставлении (изменение длинного на ключевое слово зависит от сценария. Если у клиента много запросов диапазона на основе этого поля, его не следует менять. Если у клиента много ключевых запросов, рекомендуется изменить).

2. Сегментов слишком много и они небольшие. Рекомендуется сделать принудительное слияние.

3. Чтобы каждый раз не создавать глобальный порядковый номер, вы можете отключить этот параметр (отказ от использования глобального порядкового номера будет занимать больше памяти)

Язык кода:js
копировать
PUT /_cluster/settings
{
persistent": {
 "search.composite_aggregations.use_global_ordinal": false
 }
}

Примечание. По умолчанию es строит полные global_ordinals индекса 1 (по сути, прямой индекс) для каждой агрегации. Он используется для кэширования, чтобы ускорить следующую агрегацию. Новые записи приведут к тому, что кеш станет недействительным, а следующая. запрос запустит полную сборку. карта сообщает es напрямую использовать значение, полученное в результате запроса для агрегации, чтобы избежать процесса построения глобального порядкового номера;

Новая запись представляет собой новый сегмент, старый сегмент не изменился, и порядковое отношение каждого сегмента не изменилось, поэтому отношение сопоставления между глобальной порядковой записью и порядковым номером старого сегмента не должно меняться, если новое. добавленный сегмент выполняется быстрее, первым. Это окажет некоторое влияние на первый запрос, но если вы не используете глобальные порядковые номера, рекомендуется, чтобы мощность поля не была слишком большой;

Обновления индекса на основе пользователей происходят относительно часто. Итоговые рекомендации:

1. Объединить сегменты

Язык кода:js
копировать
POST index_name/_forcemerge?max_num_segments=1

2. Закройте следующие параметры

Язык кода:txt
копировать
"search.composite_aggregations.use_global_ordinal": false
boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода