我有与SQL中的联合操作类似的查询。我需要为每个索引指定结果集的大小。例如,我想从第一个索引中获取10条记录,从第二个索引中获取15条记录。
我的查询:
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [{
"match_phrase_prefix": {"userName": "ar" }
}]
}
},
{
"bool": {
"must": [{
"match_phrase_prefix": { "groupName": "ar" }
}]
}
}
]
}
}
}
发送查询的网址:
http://website.com:9200/user_data,group_data/_search
如果您有任何想法,我将不胜感激。 谢谢
答案 0 :(得分:3)
我认为您无法通过简单的查询来做到这一点。
但是可以使用Top Hits aggregation来做到这一点,它使您可以通过存储桶聚合器按特定字段对结果集进行分组。您的案例应如下所示:
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [{
"match_phrase_prefix": {"userName": "ar" }
}]
}
},
{
"bool": {
"must": [{
"match_phrase_prefix": { "groupName": "ar" }
}]
}
}
]
}
}, #Your query stills the same
"size": 0, #This will bring back nothing within the field "hits", so you can focus in the "aggregations" field.
"aggs": {
"10_usernames": {
"top_hits": {
"_source": {
"includes": [ "userName" ]
},
"size" : 10
}
},
"15_groupames": {
"top_hits": {
"_source": {
"includes": [ "groupName" ]
},
"size" : 15
}
}
}
}
您将在“聚合”字段中看到结果。
希望这会有所帮助! :D
答案 1 :(得分:0)
好的,谢谢您的帮助
最终我选择了另一种方法。我使用Multi Search API,它允许您一次执行多个请求。我的查询是:
POST http://website.com:9200/_msearch
{"index": "user_data"}
{"size":10,"query":{"bool":{"must":[{"match_phrase_prefix":{"userName":"##USER_TEXT##"}}]}}}
{"index": "group_data"}
{"size":15,"query":{"bool":{"must":[{"match_phrase_prefix":{"groupName":"##USER_TEXT##"}}]}}}