为Elasticsearch中的每个子查询指定大小

时间:2019-08-12 14:48:36

标签: elasticsearch

我有与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

如果您有任何想法,我将不胜感激。 谢谢

2 个答案:

答案 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##"}}]}}}