elasticsearch,geocoding,Indexing,elasticsearch,Geocoding" /> elasticsearch,geocoding,Indexing,elasticsearch,Geocoding" />

Indexing 在elasticsearch中创建或更新映射

Indexing 在elasticsearch中创建或更新映射,indexing,elasticsearch,geocoding,Indexing,elasticsearch,Geocoding,我是Elasticsearch的新手,目前正致力于实现搜索的geo_distance过滤器。到目前为止,我的索引具有以下映射(我已删除了一些字段): geo_distance字段将在location字段上实现,其中一个示例实例如下所示: "location": [ 71, 60 ], 即,采用geoJSON格式[lon,lat] 我知道我必须更新索引,以便位置字段的类型为geo_point,如文档中所述()。似

我是Elasticsearch的新手,目前正致力于实现搜索的
geo_distance
过滤器。到目前为止,我的索引具有以下映射(我已删除了一些字段):

geo_distance字段将在location字段上实现,其中一个示例实例如下所示:

"location": [
               71,
               60
            ],
即,采用geoJSON格式
[lon,lat]

我知道我必须更新索引,以便位置字段的类型为
geo_point
,如文档中所述()。似乎我必须删除索引并创建一个新的索引,但我无法做到这一点

我走对了吗?如果有人能帮助我创建一个新的索引,或者用正确的数据类型更新我现有的索引,我将不胜感激


非常感谢

一般来说,您可以使用放置映射api(参考)更新索引映射:

它对于添加新字段特别有用。但是,在您的情况下,您将尝试更改位置类型,这将导致冲突,并阻止使用新映射

您可以使用put-mapping api添加另一个属性,该属性包含作为lat/lon数组的位置,但无法更新以前的位置字段本身

最后,您必须重新索引数据,以便将新映射考虑在内

最好的解决方案是创建一个新的索引


如果您在创建另一个索引时遇到的问题是停机时间,您应该查看以使事情顺利进行。

请注意,此答案中提供的url中有一个错误:

对于PUT映射请求:url应如下所示:

而不是


在后来的Elasticsearch版本(7.x)中,类型被删除。更新映射可能会变成:

curl -XPUT "http://localhost:9200/test/_mapping" -H 'Content-Type: application/json' -d'{
  "properties": {
    "new_geo_field": {
      "type": "geo_point"
    }
  }
}'
正如其他人所指出的那样,如果字段存在,您通常必须这样做。也有例外情况,例如添加新的子字段或更改分析设置

您不能“创建映射”,因为映射是使用索引创建的。通常,您会在创建索引时(或通过)定义映射:


这是因为,至少在生产中,您希望避免让Elasticsearch“猜测”新字段。这就是产生这个问题的原因:地理数据被解读为一组
长的
值。

谢谢汤姆的及时回答。我将如何具体地为位置创建具有正确类型的新索引?我目前处于开发环境中,因此停机等不是问题。到目前为止,我一直在使用这段代码创建索引:(在底部)我不熟悉mongoDB河,但从我看到的情况来看,这条河是基于动态映射的(ES自动检测要应用的映射,基于值)。您可以通过以下方式进行控制,然后用新创建的索引名/类型名替换任意索引名和任意类型名。你也许应该为这个问题创建一个新的问题,因为它是一个独立的主题。下面提供的方法非常有效。谢谢!是否可以创建一个新索引,但保存存储的文档?请看:它应该起作用:)这取决于您使用的Elasticsearch版本。例如,版本0.90使用了您认为无效的符号:
curl -XPUT 'http://localhost:9200/advert_index/_mapping/advert_type' -d '
{
    "advert_type" : {
        "properties" : {

          //your new mapping properties

        }
    }
}
'
curl -XPUT "http://localhost:9200/test/_mapping" -H 'Content-Type: application/json' -d'{
  "properties": {
    "new_geo_field": {
      "type": "geo_point"
    }
  }
}'
curl -XPUT "http://localhost:9200/test" -H 'Content-Type: application/json' -d'{
  "mappings": {
    "properties": {
      "foo_field": {
        "type": "text"
      }
    }
  }
}'