OpenSearhDashbordを触ってみた話
仕事で、OpenSearchDashbordを触る機会が増えたので、基本的な使い方などを調べてみた備忘録
調べる前の私の知識はざっくばらんにこの4つ
- OpenSearchはElasticsearchをフォークして開発されたもの
- DSL書く時に分からなければElasticsearchでググれば情報いっぱい出てくる
- documentを格納しているのがindex(documentはレコード、indexはテーブルみたいなイメージ)
- 障害に備えてレプリカがあるとか
OpenSearchの基本
こちらの記事が非常にわかりやすかったのでオススメ
曖昧になっていた用語の意味などを理解できた因みに、OpenSearchの公式ドキュメントを読んでいて初めて気づいたのだが、
indexの複数形は「indices」らしい(indexesじゃない、、、!)
Discover
indexを指定して、条件に合ったdocumentを検索することが可能
operatorの「is one of」
フィルター条件の「is one of」で複数値を設定した場合、OR検索になる
例)nameフィールドに対して「小木」「山田」「佐藤」を設定した場合
name = 小木 あるいは、name = 山田 あるいは、name = 佐藤であるドキュメントが検索結果に出る
keywordの有無
keywordあり:完全一致
keywordなし:部分一致
例)name.keyword = 「小木」が検索条件なら、
name = 小木であるドキュメントが結果に表示される
name = 「小」が検索条件なら、name = 小木 や、 name = 小峠、name = 小堺 などのドキュメントも結果に表示される
検索結果のアイコン
検索結果一覧にて+アイコン、-アイコンなどが表示されているがホバーすると簡易説明文が出てくる
- Filter for value:絞り込み条件に、そのフィールドがその値であるという条件を追加する
- 例)name=佐藤のドキュメントでFilter for valueのアイコンをタップすると、検索条件にname=佐藤で絞り込みを追加する
- Filter out value:絞り込み条件に、そのフィールドがその値でないという条件を追加する
- 例)name=佐藤のドキュメントでFilter out valueのアイコンをタップすると、検索条件にname!=佐藤で絞り込みを追加する
- Filter for field present:絞り込み条件に、そのフィールドが存在するという条件を追加する
- 例)name=佐藤のドキュメントでFilter for field presentのアイコンをタップすると、検索条件にname existsで絞り込みを追加する
- Toggle Column in Table:検索結果に表示されるフィールドとして選択する
- 例)name=佐藤のドキュメントでToggle Columnのアイコンをタップすると、検索結果のフィールドがnameのみが表示される
DSLでの書き方を取得可能
Inspect > Request:リクエストDSLをコピーできる
Inspect > Response:レスポンスをコピーできる
Dev Tools
DSL
必ずJSON形式
- キー(key)とバリュー(value)は必ずセット
- キーは必ずダブルクォーテーションで囲む(シングルはダメ🙅♀️)
- {"key1": "value1", "key2": "value2"}
レスポンスについて(一部)
- took:結果を返すまでにかかった時間(ミリ秒)
- hits.total.value:結果の数
デフォルトは10000までだが、リクエストに"track_total_hits": true
を追加すると全数返却してくれる - hits.hits:結果(ドキュメント)
デフォルトは10個までだが、リクエスに"size": 数字
を追加すると設定した個数分だけ返却してくれる
from+size > 10000の場合、illegal_argument_exception
エラーとなるため、指定不可
10000件を超えるデータが欲しい場合は、ScrollAPIや、search_afterパラメータを使うのが推奨されている
ショートカット
DevTools画面のエディターペインにて、地味に役立ったものを紹介(対象OS:Mac)
- Command + I:クエリ文を自動で整形してくれる
- Command + Enter:カーソルがある位置(もしくは、選択している箇所)のリクエストを送信してくれる
Helpタブを開くと、他にも使えそうなショートカットが書かれているので
一読オススメですぞ
複数のindexで検索したい時
Index Management > Indices > 該当のインデックス > Alias
より、エイリアスを設定することが可能
DSLで複数のindexに対して、検索したい場合はエイリアスを設定するのがオススメ
例)
- 日本の東京都民の住民データが格納されているtokyoインデックス
- 日本の神奈川県民の住民データが格納されているkanagawaインデックス
- 日本の千葉県民の住民データが格納されているchibaインデックス
- アメリカのロサンゼルスの住民データが格納されているLos Angelesインデックス
があった場合、
日本国内で年齢が20歳のデータを抜き出したい時は
1〜3はjapanエイリアスを設定
GET japan/_search
{
"size": 10000,
"query": {
"term": {
"age": {
"value": "20"
}
}
}
}
全index内で検索したい時
インデックス名を書かなければOK
GET /_search
でindex指定なしで検索可能
返却して欲しいフィールドを指定可能
_sourceパラメータを使用する
GET japan/_search
{
"_source": ["name","age"],
"query": {
"term": {
"age": {
"value": "20"
}
}
}
}
Discussion