1
votes

I am using elasticsearch with mongoosastic npm module. I am trying to apply filter on geo coordinates having following model structure

geoLocation: {
    type: {
      type: String,
      default: 'Point'
    },
    coordinates: [Number] //orders should be lat,lng
  }

with the mapping as follows

{
      "events": {
        "settings": {
          "analysis": {
            "filter": {
              "edgeNGram_filter": {
                "type": "edgeNGram",
                "min_gram": 1,
                "max_gram": 50,
                "side": "front"
              }
            },
            "analyzer": {
              "edge_nGram_analyzer": {
                "type": "custom",
                "tokenizer": "edge_ngram_tokenizer",
                "filter": [
                  "lowercase",
                  "asciifolding",
                  "edgeNGram_filter"
                ]
              },
              "whitespace_analyzer": {
                "type": "custom",
                "tokenizer": "whitespace",
                "filter": [
                  "lowercase",
                  "asciifolding"
                ]
              }
            },
            "tokenizer": {
              "edge_ngram_tokenizer": {
                "type": "edgeNGram",
                "min_gram": "1",
                "max_gram": "50",
                "token_chars": [
                  "letter",
                  "digit"
                ]
              }
            }
          }
        },
        "mappings": {
          "event": {
            "_all": {
              "index_analyzer": "nGram_analyzer",
              "search_analyzer": "whitespace_analyzer"
            },
            "properties": {
              "title": {
                "type": "string",
                "index": "not_analyzed"
              },
              "geoLocation": {
                "index": "not_analyzed",
                "type": "geo_point"
              }
            }
          }
        }
      }
    }

Query

{
        "query": {
          "multi_match": {
            "query": "the",
            "fields": ["title", ]
          }
        },
        "filter" : {
            "geo_distance" : {
                "distance" : "200km",
                "geoLocation.coordinates" : {
                    "lat" : 19.007452,
                    "lon" : 72.831556
                }
            }
        }
      }

I am unable to create indexing on the geo coordinates with the following model structure, I dont understand if it is not possible to index geo coordinates with the above model structure because in my case the coordinates has order as lat,long and I have found somewhere that elasticsearch expects coordinates order as long,lat.

Error

Error: SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[CDHdgtJnTbeu8tl2mDfllg][events][0]: SearchParseException[[events][0]: from[-1],size[-1]: Parse Failure [Failed to parse source

curl -XGET localhost:9200/events

{
  "events": {
    "aliases": {},
    "mappings": {
      "1": {
        "properties": {
          "location": {
            "type": "double"
          },
          "text": {
            "type": "string"
          }
        }
      },
      "event": {
        "properties": {
          "city": {
            "type": "string"
          },
          "endTime": {
            "type": "date",
            "format": "dateOptionalTime"
          },
          "geo_with_lat_lon": {
            "type": "geo_point",
            "lat_lon": true
          },
          "isActive": {
            "type": "boolean"
          },
          "isRecommended": {
            "type": "boolean"
          },
          "location": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        }
      }
    },
    "settings": {
      "index": {
        "creation_date": "1461675012489",
        "uuid": "FT-xVUdPQtyuKFm4J4Rd7g",
        "number_of_replicas": "1",
        "number_of_shards": "5",
        "events": {
          "mappings": {
            "event": {
              "_all": {
                "enabled": "false",
                "search_analyzer": "whitespace_analyzer",
                "index_analyzer": "nGram_analyzer"
              },
              "properties": {
                "geoLocation": {
                  "coordinates": {
                    "type": "geo_shape",
                    "index": "not_analyzed"
                  }
                },
                "location": {
                  "type": "string",
                  "index": "not_analyzed"
                },
                "title": {
                  "type": "string",
                  "index": "not_analyzed"
                },
                "geo_with_lat_lon": {
                  "type": "geo_point",
                  "lat_lon": "true",
                  "index": "not_analyzed"
                }
              }
            }
          },
          "settings": {
            "analysis": {
              "analyzer": {
                "edge_nGram_analyzer": {
                  "type": "custom",
                  "filter": [
                    "lowercase",
                    "asciifolding",
                    "edgeNGram_filter"
                  ],
                  "tokenizer": "edge_ngram_tokenizer"
                },
                "whitespace_analyzer": {
                  "type": "custom",
                  "filter": [
                    "lowercase",
                    "asciifolding"
                  ],
                  "tokenizer": "whitespace"
                }
              },
              "filter": {
                "edgeNGram_filter": {
                  "max_gram": "50",
                  "type": "edgeNGram",
                  "min_gram": "1",
                  "side": "front"
                }
              },
              "tokenizer": {
                "edge_ngram_tokenizer": {
                  "max_gram": "50",
                  "type": "edgeNGram",
                  "min_gram": "1",
                  "token_chars": [
                    "letter",
                    "digit"
                  ]
                }
              }
            }
          }
        },
        "version": {
          "created": "1070099"
        }
      }
    },
    "warmers": {}
  }
}
1
In your query, instead of "geoLocation.coordinates" simply use "geoLocation" and it will work.Val
@Val -- let me tryDeepika Chalpe
@Val -- Its still not working. Actually indexing is not getting created on the filed geolocation.Deepika Chalpe
What error do you get now?Val
@val : same error as aboveDeepika Chalpe

1 Answers

2
votes

I got a solution for my question

Mapping

PUT /geo_test

{
   "mappings": {
      "type_test": {
         "properties": {
            "name": {
               "type": "string"
            },
            "geoLocation": {
               "type": "nested",
               "properties": {
                  "coordinates": {
                     "type": "geo_point",
                     "lat_lon": true
                  }
               }
            }
         }
      }
   }
}

Query

POST /geo_test/type_test/_search

{
   "query": {
      "filtered": {
         "filter": {
            "nested": {
               "path": "geoLocation",
               "query": {
                  "filtered": {
                     "filter": {
                        "geo_distance": {
                           "distance": 5,
                           "distance_unit": "km",
                           "geoLocation.coordinates": {
                              "lat": 41.12,
                              "lon": -71.34
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   }
}