スタジオおふとん

プログラミング系

Elasticsearchチュートリアルをやり始めたが、バージョンが違いすぎて肩こりがやばい(未完)

code46.hatenablog.com

こちらの記事をやってみています。
mappingから全然うまくいかなくてかなりしんどいです。
ちなみに私のデータベース知識は「mysql、あぁ聞いたことある。全然わからんけど」レベルです。
jsonも同じようなレベルです。
ぶっちゃけアプリ層全然わかんないっす。

途中までやった結果、もうどの情報が最新かわからん。という状態になってしまっていったん断念。

一応、やったことを以下に記載します。
役に立たなくはない。

Incorrect HTTP method for uri

これは allowed: [GET, DELETE, PUT, HEAD]って言ってくるので、まぁそれに従うのがベターでしょう。
っつても、最終的にいろいろ話変わってくるんですが。

Content-Type header [application/x-www-form-urlencoded] is not supported

Content-Typeの指定必須らしいです。

dev.classmethod.jp

action_request_validation_exception

これ、マジで根が深いです。
ここからcurl使うのやめて、kibanaのDev Tools使うことにしました。

analyzerとmappingの作り方のバージョン違い

analyzerの作り方

www.elastic.co

これを参考に。
ただ、kuromojiそのまま使えばいいんじゃないかな?と若干思ってます。
最後までやってないので、うまくいくかわかんないですが。

mappingの作り方

まず、この辺をやっておいたほうがいいです。

qiita.com

これを見ると、明らかにmappingの作り方が違うなー、と思うはずです。
その後、Elasticsearchチュートリアル - 不可視点のElasticsearchのデータ構造あたりの図と見比べるとなんとなくわかるはず。

要は、 PUT index/type/_mapping としたうえで、typeから指定する必要がある。

と思ったんですが、そもそもこれも公式と違うし古いんじゃないか説。 こっからもうめちゃくちゃです。

www.elastic.co

"type": "string"は使えない

"type": "text"になります

"type": "geo_point"に対して"store": "yes"は使えない?

よくわかりませんでしたが、エラーメッセージ的に以下にしました。 "store": "true"

以上を踏まえて

analyzer指定してないので、よくないかも。

PUT ldgourmet/restaurant/_mapping
{
  "restaurant": {
    "properties": {
      "restaurant_id": {
        "type": "integer"
      },
      "name": {
        "type": "text"
      },
      "name_alphabet": {
        "type": "text"
      },
      "name_kana": {
        "type": "text"
      },
      "address": {
        "type": "text"
      },
      "description": {
        "type": "text"
      },
      "purpose": {
        "type": "text"
      },
      "category": {
        "type": "text"
      },
      "photo_count": {
        "type": "integer"
      },
      "menu_count": {
        "type": "integer"
      },
      "access_count": {
        "type": "integer"
      },
      "closed": {
        "type": "boolean"
      },
      "location": {
        "type": "geo_point",
        "store": "true"
      }
    }
  }
}

と、ここまではうまくいったんですが、次にrating mapを追加しようとしたら、以下のメッセージが。
"Rejecting mapping update to [ldgourmet] as the final mapping would have more than 1 type: [restaurant, rating]"
Elasticsearch 6 を利用する前に把握しておいた方がよさそうなこと | Developers.IOにあるようにインデックス内の複数タイプ利用不可みたいです。
というか、上記のリンク先の内容、string->text問題とかだいたい詰まったこと書いてあるから、読んでおいたほうがいいですね。

まぁ、なんか解決策はあるんだろうけど、もうめんどくさすぎるのであきらめるか、最初からやり直したほうがいい気がしてきました。