Elasticsearch单个请求做联盟查询前N个

时间:2016-04-09 14:53:16

标签: elasticsearch nest

不确定如何在Elasticsearch中像 union 那样执行SQL。我尝试了 bool 查询,但它还没有达到我的要求。例如,文档结构是

{
  "id": "123",
  "authorId": 28,
  "title": "Five Ways to Tap into...",
  "byLine": "ashd jsabbdjs international",
  "category": "Cat1"
}

当用户输入内容时,我需要在每个"类别" 中找到前5个匹配的"标题" 。这可以使用Elasticsearch的多个查询来完成,但我想知道是否有其他方法可以在一个请求中执行此操作。

2 个答案:

答案 0 :(得分:1)

使用top_hits子聚合聚合:

{
  "size": 0,
  "query": {"match_all": {}},
  "aggs": {
    "categories": {
      "terms": {
        "field": "category",
        "size": 10
      },
      "aggs": {
        "top_5": {
          "top_hits": {
            "size": 5
          }
        }
      }
    }
  }
}

答案 1 :(得分:0)

以下是基于“category”

返回多个存储桶的查询
{
   "size": 0,
   "query": {
      "bool": {
         "must": [
            {
               "terms": {
                  "authorId": [
                     1,
                     28
                  ]
               }
            }
         ],
         "should": [
            {
               "query_string": {
                  "query": "*int*",
                  "fields": [
                     "title^2",
                     "byLine^1"
                  ]
               }
            }
         ]
      }
   },
   "aggs": {
      "categories": {
         "terms": {
            "field": "category",
            "size": 10
         },
         "aggs": {
            "top_5": {
               "top_hits": {
                  "size": 5
               }
            }
         }
      }
   }
}