我无法使用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;映射属性被忽略。
答案 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<>
而不是普通的int
或text
等。他们在文档中说,这是因为Elasticsearch就是这样期望数据。我可以想象拥有set<>
或list<>
会使事情变得更加复杂和难以读/写。我想我必须通过相应的基准测试来测试它是否更好...
答案 1 :(得分:0)
您可以找到一个真实的示例,该示例将here中的geo_point
数据类型与elassandra
一起使用