elassandra geopoint mapping失败

时间:2018-01-14 22:10:59

标签: geopoints elassandra

我无法使用elassandra和cassandra-express驱动程序映射地理位置。

geopoint UDT:

manageESIndex: true,
udts: {
  geopoint: {
    lat: 'double',
    lon: 'double'
  }
}

cassandra表弹性映射:

location: {
  type: 'frozen',
  typeDef: '<geopoint>'
}
...
es_index_mapping: {
  discover: '.*',
  properties: {
    "location": {
      "type": "geo_point"
    }
  }
}

生成的弹性映射是:

"location": {
    "type": "nested",
    "cql_collection": "singleton",
    "cql_udt_name": "geopoint",
    "properties": {
        "lat": {
            "type": "double",
            "cql_collection": "singleton"
        },
        "lon": {
            "type": "double",
            "cql_collection": "singleton"
        }
    }
}

可以看出,映射不会产生geo_point,而是产生纬度/经度对。尝试进行距离搜索时,这不起作用。似乎在使用&#39;发现&#39;映射属性被忽略。

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,即类型/列不同。

文档说,当您使用时:

discover: '.*'

它会发现所有列,但您可以使用以下方法覆盖

properties: {
  <column-name>: {
    type: '<specific-type>',
    cql_collection: 'singleton'
  }
}

事实是替代实际上并没有发生。 (尝试使用最新版的Elassandra 6.2.3.8。)

我发现,仅拼出所有列并以这种方式创建映射就容易得多,而从不使用discover: ...字段。

但是,我一次使用discover: ...来获取默认的映射,并了解应该在自己的定义中使用的内容。不过,通常这有些不对,我需要做一些细微的调整。但是,最后,一旦我删除了discover: '.*'行,它对我来说就很好了。

非常重要的一件事是"cql_collection": "singleton"。没有它,默认设置是将列创建为set<>list<>而不是普通的inttext等。他们在文档中说,这是因为Elasticsearch就是这样期望数据。我可以想象拥有set<>list<>会使事情变得更加复杂和难以读/写。我想我必须通过相应的基准测试来测试它是否更好...

答案 1 :(得分:0)

您可以找到一个真实的示例,该示例将here中的geo_point数据类型与elassandra一起使用