易企秀这边在搜索推荐业务中经常会用到多路数据召回,比如一页60个商品位置,要求按照免付费以固定的比例进行展示,这个时候就需要分开查询,如果进行串行查询那么接口查询的响应时间就会翻倍,更好的做法是使用ES的多路查询方式进行操作
_msearch
_msearch对应的是一个query数组,每个一个query都可以设置单独的from、size以及查询排序逻辑
- 一个简单的例子
GET my-index-000001/_msearch
{ }
{"query" : {"match" : { "message": "this is a test"}}}
{"index": "my-index-000002"}
{"query" : {"match_all" : {}}}
查询与查询直接可以使用换行符,内部不行
可以发现返回的外层多了一个responses数组, 接口执行时间以最大响应query时间为准

- 支持配置查询模板
创建查询模板
POST /_scripts/my_template_1
{
"script": {
"lang": "mustache",
"source": {
"query": {
"match": {
"message": "{{query_string}}"
}
}
}
}
}
使用模板进行_msearch查询
GET _msearch/template
{"index" : "main"}
{ "id": "my_template_1", "params": { "query_string": "some message" } }
需要注意的是如果使用的是http接口,那么Content-Type需要设置为:application/x-ndjson
网友评论