UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

Elasticsearch

【Elasticsearch】Aggregateしたものの中で条件にマッチしたものだけでsumしたい

ElasticsearchのAggregationで集約するときに、ある条件にマッチしたドキュメント(レコード)だけでsumしたい 例えば、物件ドキュメントが以下のような物件タイプというフィールドを持っている場合 物件タイプ: アパート、マンション、一軒家、ホテル、コン…

【Elasticsearch】Reindexの進捗が知りたい

Reindex実行後、Reindexが終わったのかどうかがわかないので進捗が知りたい 下のドキュメントによると_tasks/で確認することができる www.elastic.co 基本的には_tasks/で実行中のタスク一覧を確認すればよさそう { "nodes": { ... "bgQV-2YaTymKCzT4bI29dg"…

【Elasticsearch】Reindexのscriptで文字列の加工

Elasticsearchで以下のようなフィールドがある id: 00000001:ja この値をコロン「:」でスプリットした時の最後の要素は言語コード(jaは日本語)を示しているのだが、これを変更してマレーシ語を意味する以下のようなデータをつくりたい id: 00000001:ms 案…

【Elasticsearch】重みをつけて検索

Elasticsearchにあるデータで、あるフィールドに重みをつけて検索したい そして、単に重み付けだけでなく条件式を書いて条件にマッチしたフィールドだけに重み付けしたい まずは重み付け検索について www.elastic.co script_scoreを利用する GET /_search { …

【Elasticsearch】Multi-match queryのtype

以前、ElasticsearchのMulti-match queryを使ってみた uga-box.hatenablog.com これの用途として、例えば"東京"のつもりで「to」と入力された時に、完全一致が一番スコアが高く、前方一致するものがアナライザーに即して順次ぶら下げたいというときに このよ…

【Elasticsearch】restore時に正規表現をつかってrenameする

Elasticsearchのindexをrestoreする場合に正規表現を使えるのは知っているが、数字を扱う場合\dが使えるのか[0-9]の方がよいのかわからなかったので調べた 例えば、Elasticsearchのindexをバージョニングしている場合で、例えば以下のようなindexが存在して…

【Elasticsearch】ES6からES7へマイグレーションでindexからtypeがなくなる

ES6からES7へマイグレーションしていて ES6のときからライトに使用していたので、アプリケーションの修正点は少なかったが、まとめておく typeがindexがなくなる www.elastic.co template作成時に以下のようにmappingsの下にitemというtypeを作っていたが、E…

【Postman】PostmanからElasticsearchのmulti searchクエリを実行する

Elasticsearchのmulti serachクエリはちょっと特殊でESのdevtoolで実行する場合は GET my-index/_msearch {"index":"accounts"} {"query":{"bool":{"should":[{"match":{"owner.first_name":"Creeple"}}]}}} このように2つのオブジェクトを改行して並べる必…

【Elasticsearch】日付ごとの集計値を出す

あるアプリの処理実行時間をstartDateTimeフィールドに格納している このstartDateTimeフィールドを使って日付毎の集計値を出したい Date histogram aggregationedit を使う www.elastic.co { "size": 0, "aggs": { "histogram_daily": { "date_histogram": …

【Elasticsearch】ES7でhitsが10,000 になる

ES7にアップグレードした環境にES6でつくったデータをrestoreして、totalのdoc数を確認したところtotal_hitsが10,000件になっていた snapshot中の問題なのか、restore中の問題なのか、ES7へのアップグレードが問題なのかわからなかったのだが ES7からデフォ…

【Elasticsearch】Multi-match queryを使ってみる

Elasticsearchをつかった検索で、複数のフィールドを検索対象とするクエリを発行したい、かつ、完全一致する場合はそのdocを通常の2倍のスコアにしたい このとき、ESのMulti-matchクエリを使うことを検討してみた www.elastic.co 基本的な使い方 this is a t…

【Elasticsearch】同じdocのはずがscoreが違う謎

同じdocのはずがscoreが違う謎の事象と遭遇した 具体的には tweetインデックスに以下のdocが入っている id user message likes 1 Aさん elasticsearch 14 2 Bさん elasticsearch 10 3 Cさん elasticsearch 12 4 Aさん elasticsearch 10 5 Bさん elasticsearc…

【Elasticsearch】Javaでgeo_distanceクエリを使う

ESのgeo_distanceクエリで、ある指定した中心からの距離で検索かけたい GET /my_locations/_search { "query": { "bool" : { "must" : { "match_all" : {} }, "filter" : { "geo_distance" : { "distance" : "200km", "location" : { "lat" : 40, "lon" : -7…

【Elasticsearch】termsに指定できる上限

termsで複数のキーワードを指定したさいに以下のエラーが発生した { "error": { "root_cause": [ { "type": "too_many_clauses", "reason": "too_many_clauses: maxClauseCount is set to 1024" } ], "type": "search_phase_execution_exception", "reason":…

【Elasticsearch】Filed Collapsing と Scroll API は併用できない

以前、Filed Collapsingについて調べたが、これの検索結果をScroll APIをつかって取得したい uga-box.hatenablog.com が、結論できないみたい https://www.elastic.co/guide/en/elasticsearch/reference/current/collapse-search-results.html

【Elasticsearch】cardinalityを使ってaggregationの結果の重複をなくす

aggregationを使って集約した結果に重複がありそうだったので、この重複をなくしたい 重複を削除して集計する場合はcardinalityを使う www.elastic.co GET /language/_search?size=0 { "aggs": { "lang": { "terms": { "field": "language", "size": 10 }, "…

【Elasticsearch】scripted fields を設けると _sourceが表示されない

ESのscripted fieldsを使って、計算した結果の一つをフィールドとして定義した際、出力結果をみるとscripted fields以外の_sourceが表示されなかった GET my-index/item/_search { "script_fields": { "my_doubled_field": { "script": { "lang": "expressio…

【Elasticsearch】Snapshot操作

ElasticsearchでSnapshotのキャンセルの仕方を毎回忘れるのでAPIをまとめてとく GCSにSnapshotをあげる 滅多にやらないので忘れがち 導入のしかたは以下 GCPでElasticsearchのGCS Repository Pluginがインストールされたカスタムイメージを作ってみる - Day-…

【Elasticsearch】Indexをまとめるときのソート順

Elasticsearchに保存するデータは、日次でつくったIndexに保存している このような運用はElasticsearchのデータ保存法として一般的 fintan.jp 上記サイトより 日次でインデックスを分割するのはElasticが推奨する方法です。性能のコントロールが容易になり、…

【Elasticsearch】データ更新中にindexがREDになった

ESのデータ更新中に急にindexのstatusがREDになってしまった 理由をみてみるとプライマリーもレプリカもALLOCATION_FAILEDになっている curl -XGET "localhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason,node" これまではrestore後にU…

【Elasticsearch】配列のフィールドから指定した要素数だけ取得する方法

結論、あまりよいやり方に思えないが、とりあえずやりたいことはできたので書き残しておく 概要 ElasticSearchの一つのドキュメントの中に画像URLが複数格納された配列のフィールドがあったとする ... images: [ "http://some-site/path/to/image/aaaaa.png,…

【Elasticsearch】特定のクエリに一致するドキュメントをすべて削除する

Elasticsearchのある時点以前のデータを全て削除したい 具体的にはクエリで以下にマッチするデータを削除したい "query": { "range": { "startDateTime": { "lte": "2020-03-07T23:55:03.399Z" } } } } このやり方を調査した やり方 _delete_by_queryを使う …

【Elasticsearch】日付ごとにindexを作るパターンの基本操作

いままでElasticsearchのシングルindexでデータをためていたが、どんどん肥大化していき古いデータの更新や本番環境へのsnapshot/restoreがそろそろ辛くなってきたため、日付ごとにindexを変えてためる運用を始めた よくログとかではこのパターンを使うよう…

【Elasticsearch】restore後にindexがUNASSIGNEDのままになる

restoreを実行後にずっとUNASSIGNED のままactiveにならずに困ってしまった 結果的にインデックスを一度削除して、もう一度restoreしたら解消したので原因不明なのだが、調査中にみた以下の記事が有益だったのでまとめておく www.datadoghq.com Elasticsearc…

【Elasticsearch】緯度経度を使って検索する

ホテルなどの宿泊施設をGoogle Map 上にマーカーを表示することを考えたとき、 Google Mapの中心を動かすと同時に(または何かボタンを押して)その四隅の緯度経度内にはいる施設を再検索をしたい これを実現するためにElasticsearchのGeo-bounding box quer…

【Elasticsearch】 [FORBIDDEN/12/index read-only / allow delete (api)]が出た

Elasticsearchを使っていて、以下のエラーが吐き出され更新ができなくなった blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];" stack overflowによるとディスクの使用率が危険な場合に発生するエラーで、 index.blocks.read_only_allow_d…

【Elasticsearch】JavaでMulti-Search APIを使う

JavaでMulti-Search APIを使いたい www.elastic.co MultiSearchRequestインスタンスを用意して、通常のSerachRequestをaddしていけばよさそう MultiSearchRequest multiSearchRequest = new MultiSearchRequest(); SearchRequest firstSearchRequest = new S…

【Elasticsearch】Field Collapsingについて

トリバゴのように一つのホテルの価格を複数のサービスで比較をすることを考えるとき 検索結果はホテルをあるソート順(おすすめ順)で並べた上で、さらに各ホテルの中で比較したいサービスがあるソート順(価格低い順)に並んでいるようにしたい これを実現…