why
https://andor.kb.asia-northeast1.gcp.cloud.es.io:9243/app/dev_tools#/console
複数の key value を持つデータで、
所持金が 100k 以上または、職位が Manager 以上で、
クレジットカードのランクが Gold
この実装をしたい
複数一致と数値範囲は range / gte , これでフィルターできるらしい。
データの作成
POST /user/_doc/1
{
"name": "kaede",
"cash": "30000",
"job_rank": "player",
"credit": "green"
}
{
"_index": "user",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
初期データを生成していく。
POST /user/_doc/2
{
"name": "tom",
"cash": "100000",
"job_rank": "manager",
"credit": "gold"
}
POST /user/_doc/3
{
"name": "suzu",
"cash": "200000",
"job_rank": "player",
"credit": "gold"
}
POST /user/_doc/4
{
"name": "yanagi",
"cash": "1000000",
"job_rank": "manager",
"credit": "none"
}
100k あって manager で gold の tom
200k あるが player で gold の suzu
1000k あり manager で none の yanagi
これらのデータも追加し、
tom と suzu だけひっかかるようにする
職位 manager 以上
{
"query": {
"bool": {
"must": [
{ "match": { "job_rank": "manager" } }
]
}
}
}
"hits": [
{
"_index": "user",
"_id": "2",
"_score": 0.6931471,
"_source": {
"name": "tom",
"cash": "100000",
"job_rank": "manager",
"credit": "gold"
}
},
{
"_index": "user",
"_id": "4",
"_score": 0.6931471,
"_source": {
"name": "yanagi",
"cash": "1000000",
"job_rank": "manager",
"credit": "none"
}
}
]
tom と yanagi だけがひっかかる
ここから gold をフィルターする
GET /user/_search
{
"query": {
"bool": {
"must": [
{ "match": { "job_rank": "manager" } }
],
"filter": [
{ "match": { "credit": "gold"}}
]
}
}
}
"hits": [
{
"_index": "user",
"_id": "2",
"_score": 0.6931471,
"_source": {
"name": "tom",
"cash": "100000",
"job_rank": "manager",
"credit": "gold"
}
}
]
bool の下には複数条件を置くことができる。
must だけでなく、filter も噛ませることで
クレジットカードが gold も持っている
tom だけに絞り込めた。
ここから、職位が player でも金をもっていれば
ヒットするようにする
GET /user/_search
{
"query": {
"bool": {
"should": [
{ "match": { "job_rank": "manager" } }
],
"filter": [
{ "match": { "credit": "gold"}}
]
}
}
}
"hits": [
{
"_index": "user",
"_id": "2",
"_score": 0.6931471,
"_source": {
"name": "tom",
"cash": "100000",
"job_rank": "manager",
"credit": "gold"
}
},
{
"_index": "user",
"_id": "3",
"_score": 0,
"_source": {
"name": "suzu",
"cash": "200000",
"job_rank": "player",
"credit": "gold"
}
}
]
manager の条件に should を入れて
filter と並列にすると
should の中身が意味をなさなくなってしまう
GET /user/_search
{
"query": {
"bool": {
"must": [
{ "match": { "job_rank": "manager,player" } },
{ "match": { "cash": "100000, 200000" } }
],
"filter": [
{ "match": { "credit": "gold"}}
]
}
}
}
なので、must の内部に条件を並べて、
その must を filter と並列に並べれば絞れる。
まとめ
should { A1, A2, }
Top comments (0)