7.4. 索引基础知识¶
GeoMesa将为给定的 SimpleFeatureType
架构(请参见 索引概述 )。这允许以优化的方式执行各种查询。GeoMesa将尽最大努力确定用于索引的属性。也可以将要使用的属性指定为 SimpleFeatureType
-请参见 自定义索引创建 了解更多细节。
7.4.1. 空间索引(Z2/XZ2)¶
如果 SimpleFeatureType
有一个 Geometry
-类型属性 (Point
, LineString
, Polygon
等),则GeoMesa将在该属性上创建空间索引。如果有不止一个 Geometry
-type属性,将使用默认属性。默认几何通常使用 *
中的前缀 SimpleFeatureType
字符串,并且是由 SimpleFeatureType.getGeometryDescriptor
。
7.4.2. 时空索引(Z3/XZ3)¶
如果 SimpleFeatureType
既有一个 Geometry
-type属性和一个 Date
属性,GeoMesa将在这些属性上创建时空索引。这个 Geometry
-使用的类型属性与上面的空间索引相同。这个 Date
选定的属性将是第一个声明的属性,也可以显式设置。看见 设置索引日期属性 有关设置索引日期的详细信息,请参阅。
7.4.3. ID索引¶
GeoMesa将始终在上创建ID索引 SimpleFeature.getID()
,除非明确禁用。
7.4.4. 属性索引¶
使用默认索引时,某些查询的回答速度很慢。例如,对于Twitter数据,您可能希望返回给定用户的所有tweet。为了加快这种类型的查询,您的简单要素类型中的任何属性都可以单独编制索引。
若要为属性编制索引,请添加一个 index
属性描述符User Data的键,其值为 true
。
备注
Acumulo数据存储有一个额外的选项来创建简化的‘Join’属性索引,这可以节省空间。看见 属性指数 了解更多细节。
SimpleFeatureType sft = ...
sft.getDescriptor("name").getUserData().put("index", "true");
import org.locationtech.geomesa.utils.geotools.SchemaBuilder
val sft = SchemaBuilder.builder()
.addString("name").withIndex()
.addDate("dtg")
.addPoint("geom", default = true)
.build("mySft")
可以通过多种方式设置用户数据。看见 设置架构选项 了解更多详细信息。
属性索引还支持二级分层索引结构。这可以改进还包含空间和/或时间谓词的属性查询。除非进行不同的配置,否则将使用默认的几何和日期属性来创建辅助Z3或XZ3索引。
备注
辅助索引只能用于针对主属性的相等查询,例如 name = 'bob'
可以利用辅助索引,但是 name ilike 'bo%'
和 name > 'bo'
不能。
可以通过指定要使用的属性来配置不同的二级索引结构,而不是使用缺省值。要自定义辅助索引,必须通过配置索引 自定义索引创建 。如果指定了几何图形和日期属性,则辅助索引将适当地为XZ3的Z3。如果仅指定了几何图形,则辅助索引将为XZ2的Z2(视情况而定)。如果只指定了日期,则辅助索引将是有序的时态索引。
例如,假设一个名为‘geom’的几何属性和一个名为‘dtg’的日期属性,以下所有方法都是在‘name’属性上配置索引的有效方法:
import org.locationtech.geomesa.utils.interop.SimpleFeatureTypes;
String spec = "name:String,dtg:Date,*geom:Point:srid=4326";
SimpleFeatureType sft = SimpleFeatureTypes.createType("mySft", spec);
// enable a default z3 and a default attribute index
sft.getUserData().put("geomesa.indices.enabled", "z3,attr:name");
// or, enable a default z3 and an attribute index with a Z2 secondary index
sft.getUserData().put("geomesa.indices.enabled", "z3,attr:name:geom");
// or, enable a default z3 and an attribute index with a temporal secondary index
sft.getUserData().put("geomesa.indices.enabled", "z3,attr:name:dtg");
要使某些属性优先于其他属性,请参见 基数暗示 。
警告
可以对列表类型属性进行索引,但查询列表类型索引可能会导致重复的结果。如果重复结果是一个问题,用户应该为列表查询实现他们自己的重复数据消除逻辑。
7.5. 索引版本控制¶
为了确保交叉兼容性,GeoMesa创建的每个索引都有一个版本号,该版本号标识数据在磁盘上的布局,该版本号在创建时是固定的。更新GeoMesa版本将提供错误修复和新功能,但不会将现有数据更新为新的索引格式。
用于每个架构的索引的确切版本可以从 SimpleFeatureType
用户数据,或简单地检查由GeoMesa创建的索引表的名称。
以下版本可用:
索引版本 |
GeoMesa版本 |
备注 |
---|---|---|
1 |
1.1.0 |
初步实施 |
2 |
1.2.1 |
支持非点几何图形 对碎片的支持 |
3 |
1.2.5 |
删除了对非点几何图形的支持,转而支持XZ 删除行值中的冗余功能ID以减小磁盘上的大小 支持按属性查看 |
4 |
1.3.1 |
支持表共享 |
5 |
2.0.0 |
使用固定的Z曲线实施 |
6 |
2.3.0 |
可配置的属性 |
7 |
3.2.0 |
修复了每年的纪元索引 |
索引版本 |
GeoMesa版本 |
备注 |
---|---|---|
1 |
1.2.2 |
初步实施 |
2 |
1.2.5 |
删除了对非点几何图形的支持,转而支持XZ 删除行值中的冗余功能ID以减小磁盘上的大小 支持按属性查看 |
3 |
1.3.1 |
优化的删除 |
4 |
2.0.0 |
使用固定的Z曲线实施 |
5 |
2.3.0 |
可配置的属性 |
索引版本 |
GeoMesa版本 |
备注 |
---|---|---|
1 |
1.2.5 |
初步实施 |
2 |
2.3.0 |
可配置的属性 |
3 |
3.2.0 |
修复了每年的纪元索引 |
索引版本 |
GeoMesa版本 |
备注 |
---|---|---|
1 |
1.2.5 |
初步实施 |
2 |
2.3.0 |
可配置的属性 |
索引版本 |
GeoMesa版本 |
备注 |
---|---|---|
1 |
1.0.0 |
初步实施 |
2 |
1.1.0 |
添加了辅助日期索引 |
3 |
1.2.5 |
删除行值中的冗余功能ID以减小磁盘上的大小 支持按属性查看 |
4 |
1.3.1 |
添加了辅助Z索引 |
5 |
1.3.2 |
对碎片的支持 |
6 |
2.0.0-m.1 |
内部行布局更改 |
7 |
2.0.0 |
使用固定的Z曲线实施 |
8 |
2.3.0 |
可配置的辅助索引属性 |
索引版本 |
GeoMesa版本 |
备注 |
---|---|---|
1 |
1.0.0 |
初步实施 |
2 |
1.2.5 |
删除行值中的冗余功能ID以减小磁盘上的大小 支持按属性查看 |
3 |
2.0.0 |
标准化索引标识符为“id” |
4 |
2.3.0 |
可配置的属性 |
这里的版本号可能与使用2.3.0之前的GeoMesa版本创建的模式并不完全对应,因为每个后端实现最初都有自己的版本控制方案。然而,在给定的GeoMesa版本中,每个索引的实现在后端是一致的,所以如果您知道GeoMesa版本,您可以从上表中确定索引格式。请参阅已存档的 GeoMesa 2.2 documentation 以查看后端特定的索引版本号。
请注意,GeoMesa 1.2.2之前的版本包含Geohash索引。该索引已被Z索引取代,不再受支持。