将3个elasticsearch查询合并为一个

时间:2017-05-30 13:52:50

标签: elasticsearch

我的基本问题是我有三个独立的查询执行空间,时间和关键字搜索。我希望以下面的用例描述的方式将它们组合成一个查询:

用户输入用于搜索文档的关键字。查询返回某些文档。用户然后通过空间搜索缩小他的搜索范围,其中存在空间查询,然后通过时间搜索进一步缩小搜索结果。

关键字查询

"query": {
    "match" : { "metadata.o2r.title" : "geosciences" } 
  }

空间查询

   {
                            "query": {
                                    "bool": {
                                            "must": {
                                                    "match_all": {}
                                            },
                                            "filter": {
                                                    "geo_shape": {
                                                            "metadata.o2r.spatial.geometry": {
                                                                    "shape": {
                                                                            "type": "polygon",
                                                                            "coordinates":
                                                                                coords


                                                                    },
                                                                    "relation": "within"
                                                            }
                                                    }
                                            }
                                    }
                            }
                    }

时间查询

{
                "query": {
                    "bool": {
                        "must": [{
                                "range": {
                                    "metadata.o2r.temporal.begin": {
                                        "from": lower
                                    }
                                }
                            },
                            {
                                "range": {
                                    "metadata.o2r.temporal.end": {
                                        "to": upper
                                    }
                                }
                            }
                        ]
                    }
                }
            }

基本想法是通过单个查询在特定时间段内为给定位置提供某些关键字的文档

合并查询

"query": {
                    "bool": {
                        "must": [  {
                            "match" : { "metadata.o2r.title" : "geosciences"
                          }
                        },
                        {
                        "filter": {
                            "geo_shape": {
                                "metadata.o2r.spatial.geometry": {
                                    "shape": {
                                        "type": "polygon",
                                        "coordinates": coords


                                    },
                                    "relation": "within"
                                }
                            }
                        }
                      },
                          {
                                "range": {
                                    "metadata.o2r.temporal.begin": {
                                        "from": lower
                                    }
                                }
                            },
                            {
                                "range": {
                                    "metadata.o2r.temporal.end": {
                                        "to": upper
                                    }
                                }
                            }


                        ]
                    }
                }

1 个答案:

答案 0 :(得分:0)

我使用bool / match运算符来组合所有查询

{
                "query": {
                    "bool": {
                        "must": [
                          {
                                "range": {
                                    "metadata.o2r.temporal.begin": {
                                        "from": from
                                    }
                                }
                            },
                            {
                                "range": {
                                    "metadata.o2r.temporal.end": {
                                        "to": to
                                    }
                                }
                            },
                            {
                                "bool": {
                                    "must": {
                                        "match_all": {}
                                    },
                                    "filter": {
                                        "geo_shape": {
                                            "metadata.o2r.spatial.geometry": {
                                                "shape": {
                                                    "type": "polygon",
                                                    "coordinates": coords


                                                },
                                                "relation": "within"
                                            }
                                        }
                                    }
                                }
                            },
                            {
    "match" : { "metadata.o2r.title" : "geosciences" }
  }
                        ]
                    }
                }
            }