Elasticsearchにおける検索用クエリを学ぶ!
本記事の概要
Elasticsearchのリファレンスを読みながら、検索クエリについてまとめました!
クエリの理解に役立てていただけたら幸いです。
最初にまず、検索クエリを実行したときElasticsearchがどういう風に結果を返すのか
について触れたいと思います。
その後、実際にクエリの例を参考にしながら解説していきます。
Elasticsearchは検索結果をどう返すのか
結論から言うと、検索用クエリのマッチ度が高いドキュメント順に返却します。
ここでいうマッチ度を関連性スコアと呼びます。
デフォルトでは、Elasticsearchは一致する検索結果を関連性スコアで並び替えます。
関連性スコアはドキュメントがクエリとどの程度一致しているかを測定します。
関連性スコアは検索APIの_scoreとして返されます。
_scoreが高いほど、ドキュメントの関連性が高くなります。
関連性スコアの計算方法はクエリの種類ごとに異なります。
Elasticsearchの検索クエリ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
GET /search { "query": { "bool": { "must": [ { "match": { "title" : "Elasticsearch" }}, { "match": { "content" : "Search" }} ], "filter": [ { "term": { "status" : "published" }}, { "range": { "publish_date" : { "gte" : "2015-01-01" }}} ] } } } |
queryではドキュメントとどの程度一致するのかという指標を、関連性スコア(_score)として返します。
must句とshould句のスコアは組み合わされており、一致するクエリが多いほど高いスコアを返します。
boolクエリは、以下の複数種類のクエリを組み合わせることができます。
クエリ | 説明 |
---|---|
must | 必ずドキュメントに一致しなければいけない。スコアに貢献する。 |
filter | 一致しないドキュメントは除外される。スコアは無視する。 |
should | 一致する場合、スコアに貢献する。 |
must_not | 必ずドキュメントに含まれてはいけない。スコア無視する。 |
matchクエリは、指定されたテキスト、数値、日付、またはブール値に一致するドキュメントを返します。
あいまい一致のオプションを含む、全文検索を実行するための標準クエリです。
検索文字のタイプミスがあっても、自動的に補完してくれます。
termクエリは、指定されたフィールドに正確な用語を含むドキュメントを返します。
rangeクエリは、指定された範囲内の用語を含むドキュメントを返します。
他にもリファレンスにたくさん載っているので、気になった方はぜひ参照してみてください。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html
よく使うコマンド
インデックス一覧の確認
インデックス名や、インデックスの状態を確認することができる。
1 2 3 |
curl -XGET 'localhost:9200/_cat/indices?v' |
インデックスのマッピングの確認
1 2 3 |
curl http://localhost:9200/{indexname}/_mapping?pretty |
ドキュメント一覧
インデックスに入っているドキュメントの一覧を確認することができる。
1 2 3 |
curl -XGET 'localhost:9200/{index_name}/_search?pretty' |
ドキュメント1件取得
インデックスにちゃんとドキュメントが入ったか確認することができる。
1 2 3 |
curl http://localhost:9200/{index_name}/_search?pretty -H "Content-type: application/json" -d '{"size":1}' |
ドキュメントの件数確認
1 2 3 |
curl -sS -XGET 'localhost:9200/{indexName}/_count?pretty' |
エイリアス確認
1 2 3 |
curl -XGET 'localhost:9200/_aliases?pretty' |
最後に
Elasticsearchの検索クエリと、よく使うコマンドについてまとめました。Elasticsearchは業務でも扱っていて知識が足りていないと実感していたので、このタイミングで記事としてまとめることができてよかったです。
Elasticsearchを触っていて思うのは、あいまい検索の奥が深いということです。analayzerを使って検索語を分解するのですが、この分解がどうなっているのか実際に確認してみないと、運用は難しいのかなと感じました。難しい分、仕様を掴んだら検索でやれることが増えるので楽しみではあります!
ElasticsearchとRDBを連携させる方法の一つとして、「RDBのデータを入れるためのインデックスを再作成する」というバッチを用意して、定刻起動させるという方法があります。
この方法をとった場合、検索の都合が良いようにRDBのデータを加工してからインデックスに投入できるので、とても便利だと感じました!
他のRDBとElasticsearchの同期のさせ方も気になるので、また今度記事にでもしようかなと思います!
以上です!