创建搜索应用程序

编辑

此功能为 Beta 版,可能会发生更改。其设计和代码不如正式 GA 功能成熟,按原样提供,不提供任何保证。Beta 版功能不受正式 GA 功能的支持 SLA 约束。

创建或更新搜索应用程序。

请求

编辑

PUT _application/search_application/<name>

先决条件

编辑

需要 manage_search_application 集群权限。还需要对添加到搜索应用程序的所有索引具有 管理权限

路径参数

编辑
create
(可选,布尔值)如果为 true,则此请求不能替换或更新现有的搜索应用程序。默认为 false
<body>

(必需,对象)包含搜索应用程序的参数

<body> 对象的属性
indices
(必需,字符串数组)与此搜索应用程序关联的 索引。所有索引都需要存在才能添加到搜索应用程序中。
template

(可选,对象)与此搜索应用程序关联的 搜索模板。搜索应用程序的模板仅存储并通过搜索应用程序访问。

  • 此搜索模板必须是 Mustache 模板。
  • 该模板必须包含 Mustache 脚本和脚本源。
  • 可以使用后续的 创建搜索应用程序 请求修改模板。
  • 如果在创建搜索应用程序时未指定模板,或者如果从搜索应用程序中删除了模板,我们将使用模板示例中定义的 query_string 作为默认值。
  • 此模板将由 搜索应用程序搜索 API 用于执行搜索。
  • 该模板接受一个可选的 dictionary 参数,该参数定义一个 JSON 模式,用于验证发送到 搜索应用程序搜索 API 的参数。
<template> 的属性
script
(必需,对象)关联的 Mustache 模板。
dictionary
(可选,对象)用于验证与 搜索应用程序搜索 API 一起使用的参数的字典。该字典必须是有效的 JSON 模式。如果未指定 dictionary,则在将参数应用到模板之前不会对其进行验证。

响应代码

编辑
404
搜索应用程序 <name> 不存在。
409
搜索应用程序 <name> 存在,并且 createtrue

示例

编辑

以下示例创建或更新名为 my-app 的新搜索应用程序

resp = client.search_application.put(
    name="my-app",
    search_application={
        "indices": [
            "index1",
            "index2"
        ],
        "template": {
            "script": {
                "source": {
                    "query": {
                        "query_string": {
                            "query": "{{query_string}}",
                            "default_field": "{{default_field}}"
                        }
                    }
                },
                "params": {
                    "query_string": "*",
                    "default_field": "*"
                }
            },
            "dictionary": {
                "properties": {
                    "query_string": {
                        "type": "string"
                    },
                    "default_field": {
                        "type": "string",
                        "enum": [
                            "title",
                            "description"
                        ]
                    },
                    "additionalProperties": False
                },
                "required": [
                    "query_string"
                ]
            }
        }
    },
)
print(resp)
const response = await client.searchApplication.put({
  name: "my-app",
  search_application: {
    indices: ["index1", "index2"],
    template: {
      script: {
        source: {
          query: {
            query_string: {
              query: "{{query_string}}",
              default_field: "{{default_field}}",
            },
          },
        },
        params: {
          query_string: "*",
          default_field: "*",
        },
      },
      dictionary: {
        properties: {
          query_string: {
            type: "string",
          },
          default_field: {
            type: "string",
            enum: ["title", "description"],
          },
          additionalProperties: false,
        },
        required: ["query_string"],
      },
    },
  },
});
console.log(response);
PUT _application/search_application/my-app
{
  "indices": [ "index1", "index2" ],
  "template": {
    "script": {
      "source": {
        "query": {
          "query_string": {
            "query": "{{query_string}}",
            "default_field": "{{default_field}}"
          }
        }
      },
      "params": {
        "query_string": "*",
        "default_field": "*"
      }
    },
    "dictionary": {
      "properties": {
        "query_string": {
          "type": "string"
        },
        "default_field": {
          "type": "string",
          "enum": [
            "title",
            "description"
          ]
        },
        "additionalProperties": false
      },
      "required": [
        "query_string"
      ]
    }
  }
}

当指定上述 dictionary 参数时,搜索应用程序搜索 API 将执行以下参数验证

  • 它仅接受 query_stringdefault_field 参数
  • 它验证 query_stringdefault_field 都是字符串
  • 它仅当 default_field 的值为 titledescription 时才接受它

如果参数无效,则 搜索应用程序搜索 API 将返回错误。

resp = client.search_application.search(
    name="my-app",
    params={
        "default_field": "author",
        "query_string": "Jane"
    },
)
print(resp)
const response = await client.searchApplication.search({
  name: "my-app",
  params: {
    default_field: "author",
    query_string: "Jane",
  },
});
console.log(response);
POST _application/search_application/my-app/_search
{
  "params": {
    "default_field": "author",
    "query_string": "Jane"
  }
}

在上面的示例中,default_field 参数的值无效,因此 Elasticsearch 将返回错误

{
  "error": {
    "root_cause": [
      {
        "type": "validation_exception",
        "reason": 'Validation Failed: 1: $.default_field: does not have a value in the enumeration [title, description];',
        "stack_trace": ...
      }
    ],
    "type": "validation_exception",
    "reason": 'Validation Failed: 1: $.default_field: does not have a value in the enumeration [title, description];',
    "stack_trace": ...
  },
  "status": 400
}