7.12. 查询属性¶
GeoMesa通过GeoTools查询提示提供高级查询功能。您可以使用这些提示来控制查询处理的各个方面,或触发分布式分析处理。
7.12.1. 设置查询提示¶
查询提示可以通过两种方式设置--编程方式或通过Geoserver请求。
7.12.1.1. 程序性提示¶
要在查询中直接设置提示,请执行以下操作:
import org.geotools.data.Query;
Query query = new Query("typeName");
query.getHints().put(key, value);
请注意,查询提示值必须与查询提示的类类型匹配。有关可用的提示及其类型,请参阅下面的内容。
7.12.1.2. Geoserver提示¶
要通过Geoserver设置提示,请修改查询URL以使用 viewparams
请求参数:
...&viewparams=key1:value1;key2:value2;
提示值将被转换为适当的类型。有关可用的提示及其可接受的值,请参阅下面的内容。
7.12.1.3. 命令行工具¶
通过GeoMesa命令行工具导出要素时,可使用设置查询提示 --hints
参数。提示应在表格中指定 key1=value1;key2=value2
。提示将根据Geoserver提示的约定转换为适当的类型。
7.12.2. 松散的包围盒¶
默认情况下,GeoMesa对主要边界框查询使用不太精确的过滤器。这会更快,并且在大多数情况下不会更改返回的结果。然而,某些用例需要确切的结果。这可以在数据存储配置级别设置,也可以在每次查询时覆盖。
钥匙 |
类型 |
地球服务器转换 |
---|---|---|
QueryHints.LOOSE_BBOX |
|
|
import org.locationtech.geomesa.index.conf.QueryHints;
query.getHints().put(QueryHints.LOOSE_BBOX(), Boolean.FALSE);
import org.locationtech.geomesa.index.conf.QueryHints
query.getHints.put(QueryHints.LOOSE_BBOX, false)
...&viewparams=LOOSE_BBOX:false
7.12.3. 精确计数¶
默认情况下,GeoMesa使用估计计数。在某些情况下,用户可能需要准确的计数。这可以通过系统属性进行设置 geomesa.force.count
或每个查询。然而,请注意,准确的计数计算起来代价很高。
钥匙 |
类型 |
地球服务器转换 |
---|---|---|
QueryHints.EXACT_COUNT |
|
|
import org.locationtech.geomesa.index.conf.QueryHints;
query.getHints().put(QueryHints.EXACT_COUNT(), Boolean.TRUE);
import org.locationtech.geomesa.index.conf.QueryHints
query.getHints.put(QueryHints.EXACT_COUNT, true)
...&viewparams=EXACT_COUNT:true
7.12.4. 过滤器兼容性¶
GeoMesa提供了有限的兼容性模式,允许对具有分布式安装的后端使用较新的客户端版本和较旧的分布式运行时版本。目前仅限于GeoMesa 1.3.7和2.3.x,带有标志 1.3
和 2.3
,分别为。仅支持某些基本查询,不支持高级选项。
钥匙 |
类型 |
地球服务器转换 |
---|---|---|
QueryHints.FILTER_COMPAT |
细绳 |
分布式安装版本 |
import org.locationtech.geomesa.index.conf.QueryHints;
query.getHints().put(QueryHints.FILTER_COMPAT(), "1.3");
import org.locationtech.geomesa.index.conf.QueryHints
query.getHints.put(QueryHints.FILTER_COMPAT, "1.3")
...&viewparams=FILTER_COMPAT:1.3
7.12.5. 查询索引¶
GeoMesa可能能够使用几种不同的索引来满足特定的查询。例如,具有空间过滤器和属性过滤器的查询可能使用主空间索引或属性索引。GeoMesa将尝试挑选最好的索引;但是,如果需要,可以直接指定索引。
钥匙 |
类型 |
地球服务器转换 |
---|---|---|
QueryHints.QUERY_INDEX |
细绳 |
索引名或标识符 |
import org.locationtech.geomesa.index.conf.QueryHints;
query.getHints().put(QueryHints.QUERY_INDEX(), "z2");
// or:
query.getHints().put(QueryHints.QUERY_INDEX(), "z2:5:geom");
import org.locationtech.geomesa.index.conf.QueryHints
query.getHints.put(QueryHints.QUERY_INDEX, "z2")
// or:
query.getHints.put(QueryHints.QUERY_INDEX, "z2:5:geom")
...&viewparams=QUERY_INDEX:z2
有关更多详细信息,请参阅 查询规划 。
7.12.6. 查询规划类型¶
GeoMesa使用基于成本的查询规划来确定给定查询的最佳索引。默认情况下,使用启发式方法来挑选索引。这种方法速度很快,但可能并不总是考虑不寻常的数据分布。如果基于启发式的查询规划不能达到预期效果,则可以根据接收过程中收集的数据统计信息使用基于统计的查询规划。 Stats
采用以成本为基础的规划; Index
使用基于启发式的计划。请注意,目前只对Acumulo和Redis数据存储实施了统计--对于其他存储,将始终使用基于启发式的规划。
查询规划也可以通过系统属性进行控制 geomesa.query.cost.type
。看见 运行时配置 了解更多细节。如果同时设置了查询提示和系统属性,则查询提示将优先。
钥匙 |
类型 |
地球服务器转换 |
---|---|---|
QueryHints.COST_EVALUATION |
|
|
import org.locationtech.geomesa.index.planning.QueryPlanner.CostEvaluation;
import org.locationtech.geomesa.index.conf.QueryHints;
query.getHints().put(QueryHints.COST_EVALUATION(), CostEvaluation.Index());
import org.locationtech.geomesa.index.planning.QueryPlanner.CostEvaluation
import org.locationtech.geomesa.index.conf.QueryHints
query.getHints.put(QueryHints.COST_EVALUATION, CostEvaluation.Index)
...&viewparams=COST_EVALUATION:index
看见 查询规划 有关查询规划策略的详细信息,请参阅。