絞り込み編
OpenSearchを触ってみた個人的メモ代わりです。
- OpenSearch でいろいろやってみる ~インストール編~
- OpenSearch でいろいろやってみる ~インデックス編~
- OpenSearch でいろいろやってみる ~絞り込み編~ (👈ココ)
- OpenSearch でいろいろやってみる ~Aggregation編~
絞り込みしてみる
全文検索は一旦置いといて、基本的な絞り込みを試してみた。
対象となるデータはインデックス編参照
単純な文字列一致
term
GET reviews/_search
{
"query": {
"term": {
"product_cd": "SAMPLE0001"
}
}
}
検索はとりあえず_searchにJSONを送り付ければできる。
"送り付ける"と言っても、GETでもPOSTでも同じっぽいですな。
これは一番シンプルな形として。
複数条件(AND/OR)
bool
GET reviews/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"product_cd": {
"value": "SAMPLE0001"
}
}
},
{
"term": {
"star": {
"value": 2
}
}
}
],
"should": [
{
"term": {
"product_cd": {
"value": "SAMPLE0002"
}
}
}
]
}
}
"size": 10
}
"bool"を使う、"must"はAND、"should"はORに相当する。
条件ごとの関係に合わせて適宜ネストするところが、最初はとっつきにくい。。。
また、"size"プロパティで取得件数も指定可能。
filter
GET reviews/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"product_cd": {
"value": "SAMPLE0001"
}
}
}
]
}
},
"size": 10
}
filterによる絞り込みも可能。
スコアを算出しない(影響されない)ので、全文検索以外は基本filterで良さそう。
SQL
ここまでいろいろやってみて、今更感あるが、
実はSQLでクエリーすることも可能。
sql
POST _plugins/_sql
{
"query": "SELECT * FROM reviews"
}
内部でDSLに読み替えてるのかな?
とは言ってもDBでやるような複雑なAggregationや多数のJOINは(まだ)無理。
こんなエラーが返ってくる↓
"Aggregation type nested is not yet implemented"
次回はいよいよ(?)Aggregaion系をやってみようと思う。