py-py’s blog

何か書くよ

Elasticsearch復習

以下の本を買った。

Learning Elastic Stack6.0

かなり良いので気になる人は買ってほしい。

良く使うqueryとaggregationやへーと思ったことを書く。

shardsとreplicas

shardsは、インデックスのproperties一つ一つのこと。別名P。
で、こいつのコピーがreplica(s)。
clusterがあって、そこにnodeが3くらい、Pが全体で5個くらいある状況を想像してほしい。
node1が死んじゃったらnode1にあるPが危なくなるでしょ。そうならないよう、各nodeにPのコピーであるreplicaをそれぞれ配置する。
そうすることでデータの損失を防ぎやすくなる。

CRUD operations

Elasticsearchに投入されたデータは、以下のAPIを通じて操作ができる。

各種説明する。

Index API

データをElasticsearchに登録(インデックス)する

その方法は以下の通りある。

  1. ドキュメントにIDを与える
  2. ドキュメントにIDを与えない

1.2.ともに以下の書き方が共通となる

PUT(or POST) /index_name/document_type/id

1.について

PUT /index_name/document_type/id

2.について

POST /index_name/document_type/

Get API

ドキュメントIDを既に知っている場合、Elasticsearchからデータを取得するのに有効

GET /index_name/document_type/id

Update API

ドキュメントの更新に利用

POST /index_name/document_type/id/_update

Delete API

ドキュメントの削除に利用

DELETE /index_name/document_type/id

インデックスとマッピングの作成方法

以下のようにして、indexのsettingを行う
PUT /index_name
{
    "settings":{
        "index":{
            "number_of_sharads":5,
            "number_of_replicas":2
        }
    }
}

settingとmappingを同時に設定することもできる

PUT /index_name
{
    "settings":{
        "index":{
            "number_of_shards":5,
            "number_of_replicas":2
        }
    },
    "mappings":{
        "document_type":{
            "properties":{
                "column1_name":{
                    "type":"something"
                },
                "column2_name":{
                    "type":"something"
                }
            }
        }
    }
}

既存のインデックスに対して、マッピングを追加することもできる

PUT /index_name/_mapping/document_type

{
    "properties":{
        "column_name":{
            "type":"something"
        }
    }
}

追加したインデックスに対してデータを追加する

POST index_name/document_type
{
    "column_name":"something"
}
descriptionとdescription.keywordの違い

以下のクエリがあるとする

{
    "index_name":{
        "mappings":{
            "document_type":{
                "properties":{
                    "description":{
                        "type":"text",
                        "fields":{
                            "keyword":{
                                "type":"descrption.keyword"
                            }
                        }
                    },
                    "name":{
                        "type":"text"
                    }
                }
            }
        }
    }
}

key.wordは何らかの分析を受けない

マッピングの更新

PUT /index_name/_mapping/document_type
{
    "properties": {
        "index_name": {
            "mapping_name": {
                "properties": {
                    "code": {
                        "type":keyword"
                    }
                }
            }
        }
    }
}

REST API

以下色々ある

  • Document APIs
  • Search APIs
  • Aggregations APIs
  • Indices APIs
  • Cluster APIs
  • cat APIs
Json response

pretty=trueにすると、GETしたときの情報がjson形式で戻されるため、人間が見やすい

Multiple indices

インデックス検索

Elasticsearchに登録したデータのあらゆるインデックスを検索する

GET /_search

ただし、表示されるのはデフォルト10件のため、表示件数を多くしたい場合

GET /_search
{
    "size":num
}

とsizeを指定すること。

また返却される項目で見ておきたいものは以下となる。

  • took: どれだけ時間がかかったかを表す
  • timed_out:false: タイムアウトなしで結果を得られたことを示す
  • _shards: 検索の成否にかかわらず、クラスタ全体でどれだけのshardsをまたがったかを示す
  • hits: 実際にマッチしたドキュメントの数を示す
一つのインデックスで全てのドキュメントを検索する
GET index_name/_search
一つのインデックスでかつドキュメントタイプを指定して全てのドキュメントを検索する
GET index_name/document_type/_search
複数のインデックスから全件検索をする
GET index_name, index2_name/_search

はーい、クエリやaggregationまでまとめられず今度また更新しましょう。