0
votes

I have used the mapping query to perform a search in ElasticSearch, and it works fine as below.

{
                "query": {
                    "bool" : {
                        "must" : {
                            "match_all" : {}
                        },
                        "filter" : {
                            "geo_distance" : {
                                "distance" : "{}mi".format(list_info.radius_b),
                                'location': {
                                    "lat": zip.lat,
                                    "lon": zip.lng
                                }
                            }
                        },
                    },
                },
                "sort" : [
                    {
                        "_geo_distance" : {
                            'location': {"lat": zip.lat,
                                        "lon": zip.lng},
                            "order" : "asc",
                            "unit" : "mi",
                            "mode" : "min",
                            "distance_type" : "sloppy_arc"
                        }
                    }
                ],
                "from": 0,
                "size": 0,
            }

However, even I add "terms", the I'm getting error: TransportError(400, u'parsing_exception', u'[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]')

{
                "query": {
                    "bool" : {
                        "must" : {
                            "match_all" : {}
                        },
                        "filter" : {
                            "geo_distance" : {
                                "distance" : "{}mi".format(list_info.radius_b),
                                'location': {
                                    "lat": zip.lat,
                                    "lon": zip.lng
                                }
                            }
                        },
                    },
                    "term" : { "status" : "approved" }
                },
                "sort" : [
                    {
                        "_geo_distance" : {
                            'location': {"lat": zip.lat,
                                        "lon": zip.lng},
                            "order" : "asc",
                            "unit" : "mi",
                            "mode" : "min",
                            "distance_type" : "sloppy_arc"
                        }
                    }
                ],
                "from": 0,
                "size": 0,
            }
1

1 Answers

3
votes

Your new term query must be located inside the bool/filter query:

{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": [
        {
          "geo_distance": {
            "distance": "{}mi".format(list_info.radius_b),
            "location": {
              "lat": zip.lat,
              "lon": zip.lng
            }
          }
        },
        {
          "term": {
            "status": "approved"
          }
        }
      ]
    }
  },
  "sort": [
    {
      "_geo_distance": {
        "location": {
          "lat": zip.lat,
          "lon": zip.lng
        },
        "order": "asc",
        "unit": "mi",
        "mode": "min",
        "distance_type": "sloppy_arc"
      }
    }
  ],
  "from": 0,
  "size": 0
}