Search code examples
rubysearchgeolocationelasticsearchtire

Mapping ElasticSearch GeoPoint Fields


We store documents that look something like this:

{
    "id": "dQesbpxeQniUWXpsnjPQ",
    "title": "Golf in Hamburg, Altona",
    "user": "CtGjEaDxSrhPbf7W7NcH",
    "location": {
        "id": "Q6sZhRHdiS3mP2innbJ9",
        "name": "Hamburg, Altona",
        "lat": 53.55,
        "lon": 9.93333,
        "slug": "hamburg-altona"
    },
    "_type": "announcement"
}

We need the announcement.location.slug to be not_analyzed (it's a slug, after all)

However the mapping won't take, we have these settings:

Tire.index(@@index_name) do
  delete
  create(mappings: {
    announcement: {
      properties: {
        "id"       => { type: 'string', index: 'not_analyzed' },
        "user"     => { type: 'string', index: 'not_analyzed' },
        "location" => {
          type: 'geo_point',
          properties: {
            "slug" => { type: 'string', index: 'not_analyzed' }
          }
        },
        "times"    => { type: 'string', analyzer: 'keyword'   },
        "sport" => {
          "properties" => {
            "slug" => { type: 'string', index: 'not_analyzed' }
          }
        }
      }
    }
  },
  settings: {
    index: {
      number_of_shards: 1,
      number_of_replicas: 0
    }
  })
  refresh
end

Note: The same mapping in curl syntax also doesn't work, but is less readable for SO, so I'm posting the Ruby code.

It seems like geo_point is overriding all other mappings on that part of the document. The documentation seems to agree.

I'm sure there's a way to use the lat_lon option, but I can't find any documentation on how that might work. (I assume one maps the individual lat and lon fields with lat_lon settings)

It might also be possible, I had hoped to use the multi field type but that doesn't seem to apply to whole sub-trees of the main document attributes.

How can I proceed without having to change my whole data model?


Solution

  • I'm afraid that you have to change your model as geo_point is a full data type and you can not add properties (meta) in it.