在elasticsearch中创建或更新映射

时间:2014-08-24 12:30:55

标签: indexing elasticsearch geocoding

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

{
advert_index: {
   mappings: {
      advert_type: {
         properties: {
            __v: {
               type: "long"
            },
            caption: {
               type: "string"
            },
            category: {
               type: "string"
            },
            **location: {
            type: "long"
            },**

         }
      }
   }
}

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

"location": [
               71,
               60
            ],

即。采用geoJSON格式[lon, lat]

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

我是否在正确的轨道上?如果有人能帮助我如何创建新索引或使用正确的数据类型更新现有索引,我将不胜感激。

非常感谢!

3 个答案:

答案 0 :(得分:58)

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

curl -XPUT 'http://localhost:9200/advert_index/_mapping/advert_type' -d '
{
    "advert_type" : {
        "properties" : {

          //your new mapping properties

        }
    }
}
'

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

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

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

最佳解决方案是创建新索引

如果您创建另一个索引的问题是停机时间,那么您应该查看aliases以便顺利进行。

答案 1 :(得分:5)

请注意,此答案中提供的网址存在错误:

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

http://localhost:9200/name_of_index/_mappings/document_type

而不是

http://localhost:9200/name_of_index/document_type/_mappings

答案 2 :(得分:3)

在更高的Elasticsearch版本(7.x)中,类型被删除。更新映射可以成为:

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

正如其他人指出的那样,如果该字段存在,则通常必须reindex。有一些例外,例如添加新的子字段或更改分析设置。

您无法“创建映射”,因为映射是使用索引创建的。通常,您将在创建索引时定义映射(或通过index templates):

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

那是因为,至少在生产中,您要避免让Elasticsearch“猜测”新字段。产生此问题的原因是:地理数据被读取为long值的数组。