加入Elasticsearch中的reverse_nested聚合

时间:2016-01-18 13:42:18

标签: elasticsearch

请帮我找一个机制来聚合以下域名或证明它在当前的API中不存在。

<% Dim myarraystring, sql
sql = "SELECT x1 FROM table"
myarraystring = ""
rs.open sql,conn
Do While Not rs.eof
myarraystring = myarraystring & rs("x") & ","
rs.movenext
Loop
rs.close %>

<script>var chartdata=[{"values":[<%= myarraystring %>],}];</script>

如何查询ES以查找有关从特定大学毕业的联系人数量的统计数据?

我找到了一种可能性,但它没有给我想要的结果,因为它不能回答上面关于联系人的问题,而只回答他们的特定配置文件(嵌套文档):

    curl -XDELETE 127.0.0.1:9200/test_index

    curl -XPUT 127.0.0.1:9200/test_index -d '{
        "mappings": {
            "contact": {
                "properties": {
                    "facebook_profile": {
                        "type": "nested",
                        "properties": {
                            "education": {
                                "type": "string"
                            },
                            "year": {
                                "type": "integer"
                            }
                        }
                    },
                    "google_profile": {
                        "type": "nested",
                        "properties": {
                            "education": {
                                "type": "string"
                            },
                            "year": {
                                "type": "integer"
                            }
                        }
                    }
                }
            }
        }
    }'

    curl -XPUT 127.0.0.1:9200/test_index/contact/contact1 -d '{
        "google_profile": {
            "education": "stanford", "year": 1990
        }
    }'

    curl -XPUT 127.0.0.1:9200/test_index/contact/contact2 -d '
    {
        "facebook_profile": {
            "education": "stanford", "year": 1990
        }
    }'

是什么让我:

    curl -XPOST '127.0.0.1:9200/test_index/_search?search_type=count&pretty=true' -d '{
        "aggs": {
            "facebook_educations": {
                "aggs": {
                    "field": {
                        "terms": {
                            "field": "contact.facebook_profile.education"
                        },
                        "aggs": {
                            "reverse": {
                                "reverse_nested": {
                                }
                            }
                        }
                    }
                },
                "nested": {
                    "path": "contact.facebook_profile"
                }
            },
            "google_educations": {
                "aggs": {
                    "field": {
                        "terms": {
                            "field": "contact.google_profile.education"
                        },
                        "aggs": {
                            "reverse": {
                                "reverse_nested": {
                                }
                            }
                        }
                    }
                },
                "nested": {
                    "path": "contact.google_profile"
                }
            }
        }
    }'

但是在这里我不能确定一个发现的联系人是相同还是不同的doc(父母),我分别无法回答我的初步问题。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

听起来你正试图aggregate on multiple fields。 Elasticsearch不直接支持这种方法,但有一些方法可以解决这个问题,并获得您正在寻找的结果。

查看discussion on Github以及documentation

如果我正确理解,是否&#34; stanford&#34;显示在facebook_profile.educationgoogle_profile.education中,您希望contact仅在聚合中计算一次。

您应该可以通过以下两种方式之一来完成此任务:

  1. 使用脚本连接存储在字段中的值:

    {
      "aggs": {
        "by_education": {
          "terms": {
            "script": "doc['contact.facebook_profile.education'].values + doc['contact.google_profile.education'].values"
          }
        }
      }
    }
    
  2. 您可以使用copy_to选项在索引时创建一个包含两个字段值的新专用字段。然后在单个字段上聚合。例如,您可以将两个字段的内容复制到名为education_combined的新字段。

    {
      "mappings":{
        "contact":{
          "properties":{
            "facebook_profile":{
              "type":"nested",
              "properties":{
                "education":{
                  "type":"string",
                  "copy_to":"education_combined"
                },
                "year":{
                  "type":"integer"
                }
              }
            },
            "google_profile":{
              "type":"nested",
              "properties":{
                "education":{
                  "type":"string",
                  "copy_to":"education_combined"
                },
                "year":{
                  "type":"integer"
                }
              }
            },
            "education_combined":{
              "type":"string"
            }
          }
        }
      }
    }
    

    然后,只需汇总education_combined

    {
      "aggs": {
        "by_education": {
          "terms": { "field": "education_combined" }
        }
      }
    }