elasticsearch搜索结果与子查询

时间:2016-04-28 08:00:19

标签: elasticsearch

开始使用elasticsearch,不确定是否可以使用一个查询以及分页。我有一个有两种类型的索引:user& blog。示例映射:

   "mappings": {
      "user": {
         "properties": {
             "name" : { "type": "string" }
         }
      },
      "blog": {
         "properties": {
             "title" : { "type": "string" },
             "author_name" : { "type": "string" }
         }
      }
   }
}

示例数据

用户:

[
    {"name": "jemmy"},
    {"name": "Tom"}
]

博客:

[
    {"title": "foo bar", "author": "jemmy"},
    {"title": "magic foo", "author": "Tom"},
    {"title": "bigdata for dummies", "author": "Tom"},
    {"title": "elasticsearch", "author": "Tom"},
    {"title": "JS cookbook", "author": "jemmy"},
]

我想查询索引,当我搜索blog时,它应该在每个匹配上执行子查询。例如:

POST /test_index/blog/_search
{
    "query": {
        "match": {
           "_all": "foo"
        }
    }
}

预期(伪)结果:

[
  {
      title: "foo bar",
      author_name: "Jemmy",
      author_post_count: 2
  },
  {
      title: "magic foo",
      author_name: "Tom",
      author_post_count: 3
  }
]

此处author_post_countblog用户撰写的帖子计数。如果它可以返回那些博客帖子而不是计数也会很棒。这可能吗?也许这个词我用得不对,但我希望我的问题很明确。

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

POST /test_index/blog/_search
{
  "query": {
    "match": {
      "_all": "foo"
    }
  },
  "aggs": {
    "counting_posts": {
      "global": {},
      "aggs": {
        "authors": {
          "terms": {
            "field": "author",
            "size": 10
          }
        }
      }
    }
  }
}

使用terms聚合时要小心,因为它正在考虑索引中的实际标记化术语列表,而不是您实际索引的内容(小写/大写,以某种方式标记化)。