多重搜索
1.0 版引入
顾名思义,多重搜索操作允许您将多个搜索请求捆绑到单个请求中。OpenSearch 会并行执行这些搜索,因此与每次搜索发送一个请求相比,您可以更快地获得响应。OpenSearch 独立执行每个搜索,因此其中一个搜索的失败不会影响其他搜索。
端点
多重搜索 API 使用以下路径
GET _msearch
GET <index>/_msearch
POST _msearch
POST <index>/_msearch
查询参数和元数据选项
所有参数都是可选的。有些参数也可以作为每个元数据行的一部分,应用于每次搜索。
参数 | 类型 | 描述 | 元数据行中支持的参数 |
---|---|---|---|
allow_no_indices | 布尔型 | 是否忽略不匹配任何索引的通配符。默认值为 true 。 | 是 |
cancel_after_time_interval | 时间 | 搜索请求将被取消的时间。在父级和子级请求级别均受支持。优先级顺序为 1. 子级参数 2. 父级参数 3. 集群设置。 默认值为 -1。 | 是 |
css_minimize_roundtrips | 布尔型 | OpenSearch 是否应尝试最小化协调节点与远程集群之间的网络往返次数(仅适用于跨集群搜索请求)。默认值为 true 。 | 否 |
expand_wildcards | 枚举 | 将通配符表达式扩展为具体的索引。多个值用逗号分隔。支持的值包括 all 、open 、closed 、hidden 和 none 。默认值为 open 。 | 是 |
ignore_unavailable | 布尔型 | 如果索引列表中不存在某个索引或分片,是忽略它而不是使查询失败。默认值为 false 。 | 是 |
max_concurrent_searches | 整数 | 最大并发搜索数。默认值取决于您的节点数量和搜索线程池大小。更高的值可以提高性能,但有使集群过载的风险。 | 否 |
max_concurrent_shard_requests | 整数 | 每个搜索在每个节点上执行的最大并发分片请求数。默认值为 5。更高的值可以提高性能,但有使集群过载的风险。 | 否 |
pre_filter_shard_size | 整数 | 默认值为 128。 | 否 |
rest_total_hits_as_int | 字符串 | hits.total 属性是作为整数 (true ) 返回还是作为对象 (false ) 返回。默认值为 false 。 | 否 |
search_type | 字符串 | 影响相关性分数。有效选项是 query_then_fetch 和 dfs_query_then_fetch 。query_then_fetch 使用分片的术语和文档频率对文档进行评分(更快,但准确性较低),而 dfs_query_then_fetch 使用所有分片的术语和文档频率(较慢,但准确性较高)。默认值为 query_then_fetch 。 | 是 |
typed_keys | 布尔型 | 是否在响应中以其内部类型作为聚合名称的前缀。默认值为 false 。 | 否 |
仅限元数据选项
某些选项不能作为整个请求的参数应用。相反,您可以将它们作为每个元数据行的一部分,应用于每次搜索。所有选项都是可选的。
选项 | 类型 | 描述 |
---|---|---|
index | 字符串,字符串数组 | 如果您未在 URL 中指定索引或多个索引(或希望覆盖单个搜索的 URL 值),您可以在此处包含它。示例包括 "logs-*" 和 ["my-store", "sample_data_ecommerce"] 。 |
preference | 字符串 | 您希望执行搜索的节点或分片。此设置对于测试可能有用,但在大多数情况下,默认行为提供最佳搜索延迟。选项包括 _local 、_only_local 、_prefer_nodes 、_only_nodes 和 _shards 。后三个选项接受节点或分片列表。示例包括 "_only_nodes:data-node1,data-node2" 和 "_shards:0,1 。 |
request_cache | 布尔型 | 是否缓存结果,这可以改善重复搜索的延迟。默认是使用索引的 index.requests.cache.enable 设置(新索引默认值为 true )。 |
路由 | 字符串 | 逗号分隔的自定义路由值,例如 "routing": "value1,value2,value3" 。 |
请求正文
多重搜索请求体遵循以下模式
Metadata\n
Query\n
Metadata\n
Query\n
- 元数据行包括选项,例如要搜索的索引和搜索类型。
- 查询行使用查询 DSL。
就像批量操作一样,JSON 不需要被压缩——空格是可以的——但它必须在单行上。OpenSearch 使用换行符来解析多重搜索请求,并要求请求体以换行符结尾。
请求示例
以下 msearch
API 请求示例对多个索引运行查询
GET _msearch
{ "index": "opensearch_dashboards_sample_data_logs"}
{ "query": { "match_all": {} }, "from": 0, "size": 10}
{ "index": "opensearch_dashboards_sample_data_ecommerce", "search_type": "dfs_query_then_fetch"}
{ "query": { "match_all": {} } }
示例响应
OpenSearch 返回一个数组,其中包含每个搜索的结果,其顺序与多重搜索请求中的顺序相同。
{
"took" : 2150,
"responses" : [
{
"took" : 2149,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 10000,
"relation" : "gte"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "opensearch_dashboards_sample_data_logs",
"_id" : "_fnhBXsBgv2Zxgu9dZ8Y",
"_score" : 1.0,
"_source" : {
"agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)",
"bytes" : 4657,
"clientip" : "213.116.129.196",
"extension" : "zip",
"geo" : {
"srcdest" : "CN:US",
"src" : "CN",
"dest" : "US",
"coordinates" : {
"lat" : 42.35083333,
"lon" : -86.25613889
}
},
"host" : "artifacts.opensearch.org",
"index" : "opensearch_dashboards_sample_data_logs",
"ip" : "213.116.129.196",
"machine" : {
"ram" : 16106127360,
"os" : "ios"
},
"memory" : null,
"message" : "213.116.129.196 - - [2018-07-30T14:12:11.387Z] \"GET /opensearch_dashboards/opensearch_dashboards-1.0.0-windows-x86_64.zip HTTP/1.1\" 200 4657 \"-\" \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)\"",
"phpmemory" : null,
"referer" : "http://twitter.com/success/ellison-onizuka",
"request" : "/opensearch_dashboards/opensearch_dashboards-1.0.0-windows-x86_64.zip",
"response" : 200,
"tags" : [
"success",
"info"
],
"timestamp" : "2021-08-02T14:12:11.387Z",
"url" : "https://artifacts.opensearch.org/downloads/opensearch_dashboards/opensearch_dashboards-1.0.0-windows-x86_64.zip",
"utc_time" : "2021-08-02T14:12:11.387Z",
"event" : {
"dataset" : "sample_web_logs"
}
}
},
...
]
},
"status" : 200
},
{
"took" : 1473,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4675,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "opensearch_dashboards_sample_data_ecommerce",
"_id" : "efnhBXsBgv2Zxgu9ap7e",
"_score" : 1.0,
"_source" : {
"category" : [
"Women's Clothing"
],
"currency" : "EUR",
"customer_first_name" : "Gwen",
"customer_full_name" : "Gwen Dennis",
"customer_gender" : "FEMALE",
"customer_id" : 26,
"customer_last_name" : "Dennis",
"customer_phone" : "",
"day_of_week" : "Tuesday",
"day_of_week_i" : 1,
"email" : "gwen@dennis-family.zzz",
"manufacturer" : [
"Tigress Enterprises",
"Gnomehouse mom"
],
"order_date" : "2021-08-10T16:24:58+00:00",
"order_id" : 576942,
"products" : [
{
"base_price" : 32.99,
"discount_percentage" : 0,
"quantity" : 1,
"manufacturer" : "Tigress Enterprises",
"tax_amount" : 0,
"product_id" : 22182,
"category" : "Women's Clothing",
"sku" : "ZO0036600366",
"taxless_price" : 32.99,
"unit_discount_amount" : 0,
"min_price" : 14.85,
"_id" : "sold_product_576942_22182",
"discount_amount" : 0,
"created_on" : "2016-12-20T16:24:58+00:00",
"product_name" : "Jersey dress - black/red",
"price" : 32.99,
"taxful_price" : 32.99,
"base_unit_price" : 32.99
},
{
"base_price" : 28.99,
"discount_percentage" : 0,
"quantity" : 1,
"manufacturer" : "Gnomehouse mom",
"tax_amount" : 0,
"product_id" : 14230,
"category" : "Women's Clothing",
"sku" : "ZO0234902349",
"taxless_price" : 28.99,
"unit_discount_amount" : 0,
"min_price" : 13.05,
"_id" : "sold_product_576942_14230",
"discount_amount" : 0,
"created_on" : "2016-12-20T16:24:58+00:00",
"product_name" : "Blouse - june bug",
"price" : 28.99,
"taxful_price" : 28.99,
"base_unit_price" : 28.99
}
],
"sku" : [
"ZO0036600366",
"ZO0234902349"
],
"taxful_total_price" : 61.98,
"taxless_total_price" : 61.98,
"total_quantity" : 2,
"total_unique_products" : 2,
"type" : "order",
"user" : "gwen",
"geoip" : {
"country_iso_code" : "US",
"location" : {
"lon" : -118.2,
"lat" : 34.1
},
"region_name" : "California",
"continent_name" : "North America",
"city_name" : "Los Angeles"
},
"event" : {
"dataset" : "sample_ecommerce"
}
}
},
...
]
},
"status" : 200
}
]
}