web-dev-qa-db-ja.com

elasticsearchでマッピングを作成または更新します

私は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 )。インデックスを削除して新しいインデックスを作成する必要があるようですが、これはできません。

私は正しい軌道に乗っていますか?新しいインデックスを作成したり、既存のインデックスを正しいデータ型で更新したりする方法を誰かが手伝ってくれたら、とても感謝しています。

どうもありがとう!

48
Axelfran

一般的に、put mappingapi(reference here )を使用してインデックスマッピングを更新できます。

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

          //your new mapping properties

        }
    }
}
'

特に、新しいフィールドを追加するのに役立ちます。ただし、あなたの場合、場所のタイプを変更しようとすると、conflictが発生し、新しいマッピングが使用されなくなります。

PutマッピングAPIを使用して、位置をlat/lon配列として含む別のプロパティを追加できますが、前のロケーションフィールド自体。

最後に、新しいマッピングを考慮するためにデータのインデックスを再作成する必要があります。

最良の解決策は、実際に新しいインデックスを作成することです

別のインデックスの作成に関する問題がダウンタイムである場合は、 aliases を見て、物事をスムーズに進める必要があります。

62
ThomasC

この回答に記載されているURLに誤りがあることに注意してください。

PUTマッピングリクエストの場合:URLは次のようになります。

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

とない

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

6
user2076066