Elasticsearch数据存储

Elasticsearch是一个流行的分布式搜索和分析引擎,它支持近乎实时的复杂搜索功能。默认字段类型映射支持字符串、数字、布尔值和日期类型,并允许复杂的分层文档。可以为地理空间文档字段定义自定义字段类型映射。这个 geo_point 类型支持可以通过坐标字符串、geohash或坐标数组指定的点几何图形。这个 geo_shape 类型支持Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon和GeometryCollection GeoJSON类型以及envelope和circle类型。自定义选项允许配置空间索引的类型和精度。

此数据存储允许通过GeoServer发布Elasticsearch索引中的功能。两者 geo_pointgeo_shape 支持类型映射。OGC过滤器被转换为Elasticsearch查询,并且可以与WMS和WFS请求中的本地Elasticsearch查询组合。

配置

配置数据存储

安装Elasticsearch GeoServer扩展后, Elasticsearch index 将是创建新数据存储时可用的矢量数据源格式。

new_store

Elasticsearch数据存储配置面板包括连接参数和搜索设置。

store_config

下表总结了可用的数据存储配置参数:

参数

描述

elasticsearch_host

用于连接到Elasticsearch的主机(IP)。可以选择包括HTTP方案和端口来覆盖默认值。可以提供多个主机。示例:

localhost
localhost:9200
http://localhost
http://localhost:9200
https://localhost:9200
https://somehost.somedomain:9200,https://anotherhost.somedomain:9200

elasticsearch_port

用于连接到Elasticsearch的默认HTTP端口。如果主机名包含端口,则忽略。

用户

Elasticsearch用户。必须具有索引的超级用户权限。

通行证

Elasticsearch用户密码

runas_geoserver_user

是否代表经过身份验证的GeoServer用户提交请求

proxy_user

用于文档查询的Elasticsearch用户。如果未提供,则所有请求都使用管理员用户凭据。

proxy_passwd

Elasticsearch代理用户密码

index_name

索引名或别名(支持通配符)

reject_unauthorized

在https连接的SSL握手期间是否验证服务器证书

default_max_features

当maxFeatures不受限制时使用的默认值

source_filtering_enabled

是否启用源字段的筛选

scroll_enabled

启用Elasticsearch扫描和滚动API

scroll_size

使用scroll API时每个碎片的文档数

scroll_time

使用scroll API时的搜索上下文超时

array_encoding

数组编码策略。允许值为 JSON (保留数组)和 CSV (保留第一个数组元素)。

grid_size

地理哈希网格大小提示(numRows*numCols)

grid_threshold

Geohash网格聚合精度将是必要的最小值,以便实际网格大小/网格大小>网格阈值

response_buffer_limit

从Elasticearch读取响应时在内存中缓冲的最大字节数

配置身份验证

基本身份验证通过 userpasswd 凭据参数。提供的用户必须对索引具有超级用户权限,才能启用在存储初始化期间执行的映射和别名请求。请注意,别名必须已经存在于Elasticearch索引中。如果您输入的别名不存在,插件将不会为您生成别名。任选 proxy_userproxy_passwd 参数可用于指定文档搜索(OGC服务)请求的替代用户。代理用户可以通过文档级安全性对索引拥有受限权限。如果未提供,则对所有请求使用默认用户。

这个 runas_geoserver_user 标记可用于使Elasticsearch请求能够代表经过身份验证的GeoServer用户提交。配置运行方式机制后,插件将添加 es-security-runas-user 具有经过身份验证的GeoServer用户名的头。见 X-Pack run-as documentation 更多信息。注意:运行方式机制仅应用于文档搜索请求。

为了增加安全性,建议定义 proxy_userproxy_passwd 当使用运行方式机制时。代理用户将在代表GeoServer用户提交请求时使用,并且可以具有受限权限,仅允许访问所有用户都可以访问的文档。可以选择部署插件以要求用户凭据和代理凭据,并强制使用 runas_geoserver_user 通过设置环境变量 org.geoserver.elasticsearch.xpack.force-runas ::

$ export JAVA_OPTS="-Dorg.geoserver.elasticsearch.xpack.force-runas $JAVA_OPTS"

配置HTTPS/SSL

SSL/TLS配置支持系统属性:

javax.net.ssl.trustStore
javax.net.ssl.trustStorePassword
javax.net.ssl.keyStore
javax.net.ssl.keyStorePassword

HttpClientBuilder 可用属性的文档。

例如,使用 javax.net.ssl.trustStore[Password] 要验证服务器证书,请执行以下操作:

$ export JAVA_OPTS="-Djavax.net.ssl.trustStore=/path/to/truststore.jks -Djavax.net.ssl.trustStorePassword=changeme $JAVA_OPTS "

配置层

Elasticsearch层的初始层配置面板将包括一个额外的弹出窗口,显示可用字段表。

field_list

项目

描述

Use All

使用图层要素类型中的所有字段

Use

用于选择将构成图层要素类型的字段

Name

字段的名称

Type

从Elasticsearch架构派生的字段的类型。对于几何图形类型,可以选择提供更具体的数据类型。

Order

整数顺序值用于对字段进行排序,其中具有较小顺序的字段将首先返回

Custom Name

提供为字段提供自定义名称的选项

Default Geometry

指示几何字段是否为默认字段。如果文档包含多个几何字段,则很有用,因为除非另有指定,否则SLD和空间过滤器将命中默认的几何字段。

Stored

指示字段是否存储在索引中

Analyzed

指示是否分析字段

SRID

几何图形的本机空间引用ID。仅限当前爱普生:4326 is支持。

Valid Date Formats

用于解析字段值和打印过滤器元素的可能有效日期格式

若要在关闭字段表后返回该字段表,请单击“图层配置”页上“要素类型详细信息”面板下的“配置弹性搜索字段”按钮。

field_list_edit

配置日志记录

日志记录可通过Log4j配置。数据存储包括日志记录,例如发送到Elasticsearch的查询对象,其日志记录级别低于默认启用的级别。要启用这些日志,请将以下行添加到GeoServer日志记录配置文件(请参见GeoServer全局设置):

log4j.category.org.geoserver.data.elasticsearch=DEBUG
log4j.category.org.geoserver.process.elasticsearch=DEBUG

日志记录配置文件将位于 logs Geoserver数据目录中的子目录。检查正在使用记录配置文件的Geoserver全局设置(例如 DEFAULT_LOGGING 等)。

日志记录

过滤

过滤功能包括OpenGIS简单比较、时间比较以及其他常见的过滤比较。Elasticsearch本机支持多种空间过滤器运算符,具体取决于类型:

  • geo_shape 类型本机支持BBOX/Intersects、Within和Disjoint二元空间运算符

  • geo_point 类型本机支持BBOX和二进制空间运算符,以及DWithin和Beyond distance缓冲区运算符

涉及Elasticsearch本机不支持的空间筛选器运算符的请求将包括对查询返回的结果的附加筛选操作,这可能会影响性能。

本机查询

原生弹性搜索查询可以通过定制呈现转换应用于WMS特征请求中, vec:GeoHashGrid ,它将聚合响应数据转换为用于显示的栅格。如果提供,则使用AND逻辑二元运算符将查询与从请求BBox、CQL或OGC筛选器派生的查询组合在一起。

实例

BBOX和CQL过滤器:

http://localhost:8080/geoserver/test/wms?service=WMS&version=1.1.0&request=GetMap
     &layers=test:active&styles=&bbox=-1,-1,10,10&width=279&height=512
     &srs=EPSG:4326&format=application/openlayers&maxFeatures=1000
     &cql_filter=standard_ss='IEEE 802.11b'

BBOX和本机查询:

   http://localhost:8080/geoserver/test/wms?service=WMS&version=1.1.0&request=GetMap
        &layers=test:active&styles=NativeQueryStyle&bbox=-1,-1,10,10&width=279&height=512
        &srs=EPSG:4326&format=application/openlayers&maxFeatures=1000


<StyledLayerDescriptor version="1.0.0"
      xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
      xmlns="http://www.opengis.net/sld"
      xmlns:ogc="http://www.opengis.net/ogc"
      xmlns:xlink="http://www.w3.org/1999/xlink"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <NamedLayer>
      <Name>test</Name>
      <UserStyle>
        <Title>Test</Title>
        <Abstract>Test Native Query</Abstract>
        <FeatureTypeStyle>
          <Transformation>
            <ogc:Function name="vec:GeoHashGrid">
              <ogc:Function name="parameter">
                <ogc:Literal>data</ogc:Literal>
              </ogc:Function>
              <ogc:Function name="parameter">
                <ogc:Literal>queryDefinition</ogc:Literal>
                <ogc:Literal>{"term":{"standard_ss":"IEEE 802.11b"}}
              </ogc:Function>
              <ogc:Function name="parameter">
                <ogc:Literal>outputBBOX</ogc:Literal>
                <ogc:Function name="env">
                  <ogc:Literal>wms_bbox</ogc:Literal>
                </ogc:Function>
              </ogc:Function>
              <ogc:Function name="parameter">
                <ogc:Literal>outputWidth</ogc:Literal>
                <ogc:Function name="env">
                  <ogc:Literal>wms_width</ogc:Literal>
                </ogc:Function>
              </ogc:Function>
              <ogc:Function name="parameter">
                <ogc:Literal>outputHeight</ogc:Literal>
                <ogc:Function name="env">
                  <ogc:Literal>wms_height</ogc:Literal>
                </ogc:Function>
              </ogc:Function>
            </ogc:Function>
          </Transformation>
          <Rule>
           <RasterSymbolizer>
             <Geometry>
               <!-- Actual geometry property name in feature source -->
               <ogc:PropertyName>geo</ogc:PropertyName></Geometry>
             <Opacity>0.6</Opacity>
             <ColorMap type="ramp" >
               <ColorMapEntry color="#FFFFFF" quantity="0" label="nodata" opacity="0"/>
               <ColorMapEntry color="#2851CC" quantity="1" label="values"/>
               <ColorMapEntry color="#211F1F" quantity="2" label="label"/>
               <ColorMapEntry color="#EE0F0F" quantity="3" label="label"/>
               <ColorMapEntry color="#AAAAAA" quantity="4" label="label"/>
               <ColorMapEntry color="#6FEE4F" quantity="5" label="label"/>
               <ColorMapEntry color="#DDB02C" quantity="10" label="label"/>
             </ColorMap>
           </RasterSymbolizer>
          </Rule>
        </FeatureTypeStyle>
      </UserStyle>
    </NamedLayer>
   </StyledLayerDescriptor>

聚合

通过通过定制呈现转换将查询包括在WMS请求中来通过WMS请求支持ElasticSearch聚合, vec:GeoHashGrid ,它将聚合响应数据转换为用于显示的栅格。

请注意,当提供聚合时,大小被设置为零,因此只返回聚合特征(例如,忽略MaxFeature并且不会有搜索命中结果)。看见 FAQ 对于使用聚合的常见问题。

Geohash网格聚合

Geohash网格聚合支持包括动态精度更新和用于可视化的自定义呈现转换。动态更新Geohash网格聚合精度以接近指定的 grid_size 基于当前bbox范围和附加 grid_threshold 参数如上所述。

通过自定义呈现转换在WMS请求中支持Geohash网格聚合可视化, vec:GeoHashGrid ,它将聚合响应数据转换为用于显示的栅格。默认情况下,栅格值对应于聚合存储桶 doc_count 。下面显示了使用GeoHashGrid渲染转换的Geoserver样式示例:

<StyledLayerDescriptor version="1.0.0"
    xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
    xmlns="http://www.opengis.net/sld"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NamedLayer>
    <Name>GeoHashGrid</Name>
    <UserStyle>
      <Title>GeoHashGrid</Title>
      <Abstract>GeoHashGrid aggregation</Abstract>
      <FeatureTypeStyle>
        <Transformation>
          <ogc:Function name="vec:GeoHashGrid">
            <ogc:Function name="parameter">
              <ogc:Literal>data</ogc:Literal>
            </ogc:Function>
            <ogc:Function name="parameter">
              <ogc:Literal>gridStrategy</ogc:Literal>
              <ogc:Literal>Basic</ogc:Literal>
            </ogc:Function>
            <ogc:Function name="parameter">
              <ogc:Literal>outputBBOX</ogc:Literal>
              <ogc:Function name="env">
                <ogc:Literal>wms_bbox</ogc:Literal>
              </ogc:Function>
            </ogc:Function>
            <ogc:Function name="parameter">
              <ogc:Literal>outputWidth</ogc:Literal>
              <ogc:Function name="env">
                <ogc:Literal>wms_width</ogc:Literal>
              </ogc:Function>
            </ogc:Function>
            <ogc:Function name="parameter">
              <ogc:Literal>outputHeight</ogc:Literal>
              <ogc:Function name="env">
                <ogc:Literal>wms_height</ogc:Literal>
              </ogc:Function>
            </ogc:Function>
          </ogc:Function>
        </Transformation>
        <Rule>
         <RasterSymbolizer>
           <Geometry>
             <!-- Actual geometry property name in feature source -->
             <ogc:PropertyName>geo</ogc:PropertyName></Geometry>
           <Opacity>0.6</Opacity>
           <ColorMap type="ramp" >
             <ColorMapEntry color="#FFFFFF" quantity="0" label="nodata" opacity="0"/>
             <ColorMapEntry color="#2851CC" quantity="1" label="values"/>
             <ColorMapEntry color="#211F1F" quantity="2" label="label"/>
             <ColorMapEntry color="#EE0F0F" quantity="3" label="label"/>
             <ColorMapEntry color="#AAAAAA" quantity="4" label="label"/>
             <ColorMapEntry color="#6FEE4F" quantity="5" label="label"/>
             <ColorMapEntry color="#DDB02C" quantity="10" label="label"/>
           </ColorMap>
         </RasterSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
 </StyledLayerDescriptor>

示例WMS请求包括具有以上自定义样式的Geohash网格聚合:

http://localhost:8080/geoserver/test/wms?service=WMS&version=1.1.0&request=GetMap
     &layers=test:active&styles=geohashgrid&bbox=0.0,0.0,24.0,44.0&srs=EPSG:4326
     &width=418&height=768&format=application/openlayers

Elasticearch聚合定义可以自动计算,也可以作为显式参数提供,例如:

<ogc:Function name="parameter">
  <ogc:Literal>aggregationDefinition</ogc:Literal>
  <ogc:Literal>{"agg": {"geohash_grid": {"field": "_ogr_geometry_.coordinates", "precision": 3}}}</ogc:Literal>
</ogc:Function>

如果存储发现它超出了其配置中设置的聚合限制,则可能会将精度更新为较小的值,请参见 grid_sizegrid_threshold 上面。

网格策略

gridStrategy :用于标识 org.geoserver.process.elasticsearch.GeoHashGrid 将用于将每个geohashgrid存储桶转换为栅格值(数字)的实现。

名字

网格策略

网格策略参数

描述

基本的

basic

栅格值是geohashgrid bucket doc_count .

公制

metric

栅格值是geohashgrid bucket度量值。

嵌套的

nested_agg

从嵌套聚合结果中提取栅格值。

gridStrategyArgs :(可选)用于指定网格策略的可选参数列表的参数。

emptyCellValue :(可选)用于指定空网格单元格值的参数。默认情况下,空网格单元格设置为 0 .

scaleMinscaleMax :(可选)用于指定应用于所有栅格值的比例的参数。每个瓦片请求都根据该瓦片的最小值和最大值进行缩放。最好将非瓦片层与此参数一起使用,以避免混淆结果。

useLog :(可选)指示是否对栅格值应用对数的标志(在缩放之前应用,如果适用)

基本的

栅格值是geohashgrid bucket doc_count .

聚合示例:

{
  "agg": {
    "geohash_grid": {
      "field": "geo"
    }
  }
}

示例桶:

{
  "key" : "xv",
  "doc_count" : 1
}

提取的栅格值: 1

公制

栅格值是geohashgrid bucket度量值。

参数索引

默认值

描述

0

metric

用于从顶级存储桶中提取度量对象的键。空字符串导致提取文档计数。

1

value

用于从度量对象中提取值的键。

聚合示例:

{
  "agg": {
    "geohash_grid": {
      "field": "geo"
    },
    "aggs": {
      "metric": {
        "max": {
          "field": "magnitude"
        }
      }
    }
  }
}

示例桶:

{
  "key" : "xv",
  "doc_count" : 1,
  "metric" : {
    "value" : 4.9
  }
}

提取的栅格值: 4.9

嵌套的

从嵌套聚合结果中提取栅格值。

参数索引

默认值

描述

0

nested

用于从geogrid bucket中提取嵌套聚合结果的键。

1

空字符串

用于从每个嵌套聚合桶中提取度量对象的键。空字符串导致提取文档计数。

2

value

用于从度量对象中提取值的键。

3

largest

largest | smallest . 用于从嵌套聚合存储桶中选择存储桶的策略。栅格单元栅格值从选定的存储桶中提取。

4

value

key | value . 用于从所选存储桶中提取栅格值的策略。 value :栅格值是选定存储段的度量值。 key :栅格值是选定存储桶的键。

5

无效的

(可选)用于将字符串键转换为数值的映射。使用格式 key1:1;key2:2 . 仅在栅格策略为 key .

聚合示例:

{
  "agg": {
    "geohash_grid": {
      "field": "geo"
    },
    "aggs": {
      "nested": {
        "histogram": {
          "field": "magnitude",
          "interval": 1,
          "min_doc_count": 1
        }
      }
    }
  }
}

示例参数:

<ogc:Function name="parameter">
  <ogc:Literal>gridStrategyArgs</ogc:Literal>
  <ogc:Literal>nested</ogc:Literal>
  <ogc:Literal></ogc:Literal>
  <ogc:Literal></ogc:Literal>
  <ogc:Literal>largest</ogc:Literal>
  <ogc:Literal>key</ogc:Literal>
</ogc:Function>

示例桶:

{
  "key" : "xv",
  "doc_count" : 1729,
  "nested" : {
    "buckets" : [
      {
        "key" : 2.0,
        "doc_count" : 5
      },
      {
        "key" : 3.0,
        "doc_count" : 107
      },
      {
        "key" : 4.0,
        "doc_count" : 1506
      },
      {
        "key" : 5.0,
        "doc_count" : 100
      },
      {
        "key" : 6.0,
        "doc_count" : 11
      }
    ]
  }
}

提取的栅格值: 4.0

实现自定义网格策略

默认情况下,在geohash网格聚合呈现转换中计算的栅格值对应于顶级 doc_count . 添加用于计算bucket数据的栅格值的附加策略当前需要对 gt-elasticsearch-process 模块如下所述。

首先创建自定义实现 org.geoserver.process.elasticsearch.GeoHashGrid 并提供了 computeCellValue 方法,该方法获取原始存储桶数据并返回栅格值。例如,默认的基本实现只返回doc_count::

public class BasicGeoHashGrid extends GeoHashGrid {
    @Override
    public Number computeCellValue(Map<String,Object> bucket) {
        return (Number) bucket.get("doc_count");
    }
}

然后更新 org.geoserver.process.elasticsearch.GeoHashGridProcess 并向策略枚举添加一个新条目以指向自定义实现。

部署定制插件后,新的Geohash网格计算机可以通过更新 gridStrategy Geoserver样式中的参数::

<StyledLayerDescriptor version="1.0.0"
    ...
        <Transformation>
          <ogc:Function name="vec:GeoHashGrid">
            ...
            <ogc:Function name="parameter">
              <ogc:Literal>gridStrategy</ogc:Literal>
              <ogc:Literal>NewName</ogc:Literal>
            </ogc:Function>

FAQ

  • 默认情况下,数组直接返回,适用于包括GeoJSON在内的多种输出格式。在对包含数组的层使用CSV输出格式时,有必要设置 array_encoding 将参数存储到 CSV 。但是请注意,在使用 CSV 只返回第一个值的数组编码。

  • 从插件的2.11.0之前的版本更新时,可能需要重新加载较旧的层以启用完全聚合和时间支持。缺少聚合数据或表单错误 IllegalArgumentException: Illegal pattern component 指示需要重新加载层。在这种情况下,必须删除图层并将其重新添加到GeoServer(例如,重新加载功能类型是不够的)。

  • 本机查询和聚合正文中的逗号必须用反斜杠转义。此外,正文可能需要进行URL编码。

  • 聚合SLD rastersymboler中的几何特性名称必须是层中的有效几何特性

  • PropertyIsEqualTo 映射到Elasticsearch术语查询,该查询将返回包含所提供术语的文档。在分析的字符串字段上搜索时,请确保搜索值与索引中使用的分析器一致。例如,查询使用默认分析器分析的字段时,值可能需要小写。有关详细信息,请参阅Elasticsearch术语查询文档。

  • PropertyIsLike 根据是否分析字段,映射到查询字符串查询或regexp查询。保留字符应根据需要进行转义。注意:区分大小写和不区分大小写的搜索可能分别不支持分析字段和未分析字段。有关详细信息,请参阅Elasticsearch查询字符串和regexp查询文档。

  • 使用关联类型映射中的有效日期格式处理日期转换,或者 date_optional_time 如果没有找到的话。请注意,UTC时区用于解析和打印日期。

  • 弹性搜索过滤 object 支持类型。默认情况下,字段名将包括字段的完整路径(例如。“父字段名,但这可以在GeoServer层配置中更改。

    • 使用路径元素引用字段时 cql_filter ,可能需要引用名称(例如。 cql_filter="parent.child.field_name"='value'

  • 弹性搜索过滤 nested 仅对非地理空间字段支持类型。

  • 圆的几何形状是近似的,可能与弹性搜索中的实现不完全一致,特别是在极端纬度(请参见 #86

  • 这个 joda-shaded 在将项目导入Eclipse时,可能需要排除模块。否则模块可能有表单的生成错误 DateTimeFormatter cannot be resolved to a type .

  • 从Elasticgeo 2.16.0更新时,请注意 Short Names 功能已被删除,因为它与Elasticsearch 2.0及更高版本不兼容。以前使用短名称的字段将还原为全名,但仍可以使用别名来实现相同的效果。