Elasticsearch关于nested结构query和filter查询语法

什么是nested结构, 简单可以理解为是嵌套数据类型… 嵌套类型需要实现定义好mapping. 

需要注意的是,默认的嵌套形式的kv并不是nested类型的,要提前定义mapping .


文章有些地方写的不严谨,后期会更新, 请查看原文链接   http://xiaorui.cc/?p=2376

下面是一个nested的数据样例, 我们首先手动指定mappings nested

PUT /xiaorui.cc
{
  "mappings": {
    "my_type": {
      "properties": {
        "user": {
          "type": "nested" 
        }
      }
    }
  }
}

然后我们开始扔数据

PUT xiaorui.cc/blog/1
{
  "group" : "fans",
  "user" : [ 
    {
      "first" : "fengyun",
      "last" :  "rui"
    },
    {
      "first" : "dehua",
      "last" :  "liu"
    },
    {
      "first" : "fengyun",
      "last" :  "liu"
    }
  ]
}

然后进行查询,我们先用传统的方式查询. 我们查询的目的是匹配liufengyun,但是他的返回结果肯定不是我们所需要的.

GET xiaorui.cc/blog/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "user.first": "fengyun" }},
        { "match": { "user.last":  "liu" }}
      ]
    }
  }
}

那对于nested该如何查询数据,需要在query filter里,指定path。

GET xiaorui.cc/blog/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must": [
            { "match": { "user.first": "fengyun" }},
            { "match": { "user.last":  "liu" }} 
          ]
        }
      }
    }
  }
}

注意其中几个参数:

1 path 定义了嵌套的对象,可以是列表

2 score_mode 定义里嵌套对象计算的分数与当前查询分数的处理方式,有avg,sum,max,min以及none。none就是不做任何处理,其他的看字面意思就好理解。

3 query/filter是查询的方式,内部定义了针对嵌套对象的查询,注意内部的查询一定要是用全路径, 比如 user.first user.last .


对于elasticsearch nested就说这么多了….


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

1 Response

  1. kibana 2016年5月31日 / 上午11:04

    使用kibana绘制图表的时候,kibana支持nested的类型吗?

发表评论

邮箱地址不会被公开。 必填项已用*标注