繁体   English   中英

Elasticsearch 聚合查询多选

[英]Elasticsearch aggregations query for multiselection

我有以下问题: 在我的应用程序中,我有多个用于过滤搜索结果的多选组合框。 在此处输入图像描述

组合框显示搜索结果的各个方面: 在此处输入图像描述

根据过滤器中的选择,其他过滤器中的分面结果会减少。 到目前为止,一切都很好。 但是,对于 combobox 中的其他可能选择,结果也会脱脂:

在此处输入图像描述

在这里,我需要没有已经选择的结果的方面。 在这个特定的领域。

到目前为止,我使用的查询如下所示:

{
"size": 0,
"query": {
    "bool": {
        "must": [
            {
                "exists": {
                    "field": "depictionID"
                }
            },
            {
                "terms": {
                    "cave.caveTypeID": [
                        4
                    ]
                }
            },
            {
                "terms": {
                    "cave.siteID": [
                        1
                    ]
                }
            },
            {
                "terms": {
                    "cave.districtID": [
                        1
                    ]
                }
            },
            {
                "terms": {
                    "cave.regionID": [
                        1
                    ]
                }
            }
        ]
    }
},
"aggs": {
    "CaveType": {
        "terms": {
            "field": "cave.caveTypeID"
        }
    },
    "Region": {
        "terms": {
            "field": "cave.regionID"
        }
    },
    "Site": {
        "terms": {
            "field": "cave.siteID"
        }
    },
    "District": {
        "terms": {
            "field": "cave.districtID"
        }
    }
}

}

到目前为止,我认为我需要将选定的字段从查询中取出并在聚合部分中过滤它们。 但是,我不明白,当两个或多个组合框已经有选择时,它是如何工作的。

有没有人有一个好主意,如何解决这个问题?

真挚地,

埃里克

您需要使用post_filter代替,如下所示:

{
  "size": 0,
  "post_filter": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "depictionID"
          }
        },
        {
          "terms": {
            "cave.caveTypeID": [
              4
            ]
          }
        },
        {
          "terms": {
            "cave.siteID": [
              1
            ]
          }
        },
        {
          "terms": {
            "cave.districtID": [
              1
            ]
          }
        },
        {
          "terms": {
            "cave.regionID": [
              1
            ]
          }
        }
      ]
    }
  },
  "aggs": {
    "CaveType": {
      "terms": {
        "field": "cave.caveTypeID"
      }
    },
    "Region": {
      "terms": {
        "field": "cave.regionID"
      }
    },
    "Site": {
      "terms": {
        "field": "cave.siteID"
      }
    },
    "District": {
      "terms": {
        "field": "cave.districtID"
      }
    }
  }
}

好吧,我确实通过将过滤器转移到聚合部分来解决问题,但是,我必须为每个 combobox 进行聚合,因为每个 combobox 都需要一个没有自己的过滤器的聚合,因此聚合急剧增长:

{
"aggs": {
    "caveType": {
        "filter": {
            "terms": {
                "cave.districtID": [
                    4
                ]
            }
        },
        "aggs": {
            "site": {
                "filter": {
                    "terms": {
                        "cave.siteID": [
                            1
                        ]
                    }
                },
                "aggs": {
                    "caveType": {
                        "terms": {
                            "size": 10000,
                            "field": "cave.caveTypeID"
                        }
                    }
                }
            }
        }
    },
    "site": {
        "filter": {
            "terms": {
                "cave.districtID": [
                    4
                ]
            }
        },
        "aggs": {
            "caveType": {
                "filter": {
                    "terms": {
                        "cave.caveTypeID": [
                            4
                        ]
                    }
                },
                "aggs": {
                    "site": {
                        "terms": {
                            "size": 10000,
                            "field": "cave.siteID"
                        }
                    }
                }
            }
        }
    },
    "district": {
        "filter": {
            "terms": {
                "cave.siteID": [
                    1
                ]
            }
        },
        "aggs": {
            "caveType": {
                "filter": {
                    "terms": {
                        "cave.caveTypeID": [
                            4
                        ]
                    }
                },
                "aggs": {
                    "district": {
                        "terms": {
                            "size": 10000,
                            "field": "cave.districtID"
                        }
                    }
                }
            }
        }
    },
    "region": {
        "filter": {
            "terms": {
                "cave.districtID": [
                    4
                ]
            }
        },
        "aggs": {
            "site": {
                "filter": {
                    "terms": {
                        "cave.siteID": [
                            1
                        ]
                    }
                },
                "aggs": {
                    "caveType": {
                        "filter": {
                            "terms": {
                                "cave.caveTypeID": [
                                    4
                                ]
                            }
                        },
                        "aggs": {
                            "region": {
                                "terms": {
                                    "size": 10000,
                                    "field": "cave.regionID"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
},
"size": 0

}

如果有人有更“优雅”的方式来做到这一点,请成为我的客人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM