Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Query DSL ›Специализированные запросы

Запрос скрипта

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

Фильтрует документы на основе предоставленного скрипта. Запрос script обычно используется в контексте фильтра.

Использование скриптов может привести к замедлению скорости поиска. См. Скрипты, кэширование и скорость поиска.

Пример запроса

resp = client.search(
    query={
        "bool": {
            "filter": {
                "script": {
                    "script": "\n            double amount = doc['amount'].value;\n            if (doc['type'].value == 'expense') {\n              amount *= -1;\n            }\n            return amount < 10;\n          "
                }
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      bool: {
        filter: {
          script: {
            script: "\n            double amount = doc['amount'].value;\n            if (doc['type'].value == 'expense') {\n              amount *= -1;\n            }\n            return amount < 10;\n          "
          }
        }
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    bool: {
      filter: {
        script: {
          script:
            "\n            double amount = doc['amount'].value;\n            if (doc['type'].value == 'expense') {\n              amount *= -1;\n            }\n            return amount < 10;\n          ",
        },
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": """
            double amount = doc['amount'].value;
            if (doc['type'].value == 'expense') {
              amount *= -1;
            }
            return amount < 10;
          """
        }
      }
    }
  }
}

Вы можете получить те же результаты в запросе поиска, используя поля выполнения. Используйте параметр fields в API _search для извлечения значений в рамках того же запроса:

resp = client.search(
    runtime_mappings={
        "amount.signed": {
            "type": "double",
            "script": "\n        double amount = doc['amount'].value;\n        if (doc['type'].value == 'expense') {\n          amount *= -1;\n        }\n        emit(amount);\n      "
        }
    },
    query={
        "bool": {
            "filter": {
                "range": {
                    "amount.signed": {
                        "lt": 10
                    }
                }
            }
        }
    },
    fields=[
        {
            "field": "amount.signed"
        }
    ],
)
print(resp)
response = client.search(
  body: {
    runtime_mappings: {
      'amount.signed' => {
        type: 'double',
        script: "\n        double amount = doc['amount'].value;\n        if (doc['type'].value == 'expense') {\n          amount *= -1;\n        }\n        emit(amount);\n      "
      }
    },
    query: {
      bool: {
        filter: {
          range: {
            'amount.signed' => {
              lt: 10
            }
          }
        }
      }
    },
    fields: [
      {
        field: 'amount.signed'
      }
    ]
  }
)
puts response
const response = await client.search({
  runtime_mappings: {
    "amount.signed": {
      type: "double",
      script:
        "\n        double amount = doc['amount'].value;\n        if (doc['type'].value == 'expense') {\n          amount *= -1;\n        }\n        emit(amount);\n      ",
    },
  },
  query: {
    bool: {
      filter: {
        range: {
          "amount.signed": {
            lt: 10,
          },
        },
      },
    },
  },
  fields: [
    {
      field: "amount.signed",
    },
  ],
});
console.log(response);
GET /_search
{
  "runtime_mappings": {
    "amount.signed": {
      "type": "double",
      "script": """
        double amount = doc['amount'].value;
        if (doc['type'].value == 'expense') {
          amount *= -1;
        }
        emit(amount);
      """
    }
  },
  "query": {
    "bool": {
      "filter": {
        "range": {
          "amount.signed": { "lt": 10 }
        }
      }
    }
  },
  "fields": [{"field": "amount.signed"}]
}

Параметры верхнего уровня для script

script
(Обязательно, объект скрипта) Содержит скрипт для выполнения в качестве запроса. Этот скрипт должен возвращать булево значение, true или false.

Примечания

Пользовательские параметры

Как и фильтры, скрипты кэшируются для более быстрого выполнения. Если вы часто изменяете аргументы скрипта, рекомендуется хранить их в параметре params скрипта. Например:

resp = client.search(
    query={
        "bool": {
            "filter": {
                "script": {
                    "script": {
                        "source": "doc['num1'].value > params.param1",
                        "lang": "painless",
                        "params": {
                            "param1": 5
                        }
                    }
                }
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      bool: {
        filter: {
          script: {
            script: {
              source: "doc['num1'].value > params.param1",
              lang: 'painless',
              params: {
                "param1": 5
              }
            }
          }
        }
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    bool: {
      filter: {
        script: {
          script: {
            source: "doc['num1'].value > params.param1",
            lang: "painless",
            params: {
              param1: 5,
            },
          },
        },
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": {
            "source": "doc['num1'].value > params.param1",
            "lang": "painless",
            "params": {
              "param1": 5
            }
          }
        }
      }
    }
  }
}

Разрешить дорогостоящие запросы

Запросы скриптов не будут выполняться, если search.allow_expensive_queries установлено в значение false.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/query-dsl-script-query.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API