Elastic - Query DSL
๐Ÿ™‰

Elastic - Query DSL

Created
May 9, 2024 05:13 AM
Last edited time
Last updated May 9, 2024
Tags
ElasticSearch
Language
URL

Intro::

Elasticsearch์˜ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ๋‚ด์šฉ์„ ์•Œ์•„๋ด…์‹œ๋‹ค.
ย 

ํ’€ ํ…์ŠคํŠธ ์ฟผ๋ฆฌ - Full Text Query

match_all

// ์•„๋ž˜ ๋‘ ์ฟผ๋ฆฌ๋Š” ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. GET my_index/_search GET my_index/_search { "query":{ "match_all":{ } } }
ย 

match

๐Ÿ’ก
ํ’€ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์ฟผ๋ฆฌ์ด๋‹ค.
match ๊ฒ€์ƒ‰์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ง‘์–ด๋„ฃ๊ฒŒ ๋˜๋ฉด ๋””ํดํŠธ๋กœ OR ์กฐ๊ฑด์œผ๋กœ ๊ฒ€์ƒ‰์ด ๋˜์–ด ์ž…๋ ฅ๋œ ๊ฒ€์ƒ‰์–ด ๋ณ„๋กœ ํ•˜๋‚˜๋ผ๋„ ํฌํ•จ๋œ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๋ชจ๋‘ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ operator ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ AND๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
GET my_index/_search { "query": { "match": { "message": "quick dog", "operator": "and" } } }
ย 

match_phrase

๐Ÿ’ก
์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ๋‚ด์šฉ์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ์ด๋‹ค. match_phrase๋Š” ์ž…๋ ฅ๋œ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ˆœ์„œ๊นŒ์ง€ ๊ณ ๋ คํ•˜์—ฌ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
GET my_index/_search { "query": { "match_phrase": { "message": "lazy dog", "slop": 1// ์ง€์ •๋œ ๊ฐ’ ๋งŒํผ ๋‹จ์–ด ์‚ฌ์ด์— ๋‹ค๋ฅธ ๊ฒ€์ƒ‰์–ด๊ฐ€ ๋ผ์–ด๋“œ๋Š” ๊ฒƒ์„ ํ—ˆ } } }
ย 

query_string

๐Ÿ’ก
๋ฉ”์„ธ์ง€ ํ•„๋“œ์—์„œ ๋„ํ๋จผํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.
GET my_index/_search { "query": { "query_string": { "default_field": "message", "query": "(jumping AND lazy) OR \"quick dog\"" } } }
ย 

Bool ๋ณตํ•ฉ ์ฟผ๋ฆฌ - Bool Query

๐Ÿ’ก
์•ž์˜ query_string ์ฟผ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ์กฐํ•ฉํ•˜๊ธฐ์—๋Š” ์šฉ์ดํ•œ ๋ฌธ๋ฒ•์ด์ง€๋งŒ ์˜ต์…˜์ด ํ•œ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ๋ฌธ ๊ฒ€์ƒ‰์—์„œ ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋ฅผ ์กฐํ•ฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒ์œ„์— bool ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ ์•ˆ์— ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๋“ค์„ ๋„ฃ๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. bool ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ์˜ 4๊ฐœ์˜ ์ธ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ ์ธ์ž ์•ˆ์— ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๋“ค์„ ๋ฐฐ์—ด๋กœ ๋„ฃ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
ย 
  • must : ์ฟผ๋ฆฌ๊ฐ€ ์ฐธ์ธ ๋„ํ๋จผํŠธ๋“ค์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • must_not : ์ฟผ๋ฆฌ๊ฐ€ ๊ฑฐ์ง“์ธ ๋„ํ๋จผํŠธ๋“ค์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • should : ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ค‘ ์ด ์ฟผ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” ๋„ํ๋จผํŠธ์˜ ์ ์ˆ˜๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.
  • filter : ์ฟผ๋ฆฌ๊ฐ€ ์ฐธ์ธ ๋„ํ๋จผํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์ง€๋งŒ ์Šค์ฝ”์–ด๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. must ๋ณด๋‹ค ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  ์บ์‹ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
ย 
GET my_index/_search { "query": { "bool": { "must": [ { "match": { "message": "quick" } }, { "match_phrase": { "message": "lazy dog" } } ] } } }
ย 

์ •ํ™•๋„ - Relevancy

๐Ÿ’ก
Elasticsearch์™€ ๊ฐ™์€ ํ’€ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์—”์ง„์€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์ž…๋ ฅ๋œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด๊ณผ ์–ผ๋งˆ๋‚˜ ์ •ํ™•ํ•˜๊ฒŒ ์ผ์น˜ํ•˜๋Š” ์ง€๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ด ์ •ํ™•๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์žฅ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋จผ์ € ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ •ํ™•ํ•œ ์ •๋„๋ฅผ relevancy๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
ย 

์Šค์ฝ”์–ด(score) ์ ์ˆ˜

๊ฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ scoreํ•ญ๋ชฉ์— ์Šค์ฝ”์–ด ์ ์ˆ˜๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ์ด ์ ์ˆ˜๊ฐ€ ๋†’์€ ๊ฒฐ๊ณผ๋ถ€ํ„ฐ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ๋‹จ์˜ max_score์—๋Š” ์ „์ฒด ๊ฒฐ๊ณผ ์ค‘์—์„œ ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Elasticsearch๋Š” ์ด ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด BM25 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.
notion image
์ด ๊ณ„์‚ฐ์—๋Š” ํฌ๊ฒŒ TF, IDF ๊ทธ๋ฆฌ๊ณ  Field Length ์ด 3๊ฐ€์ง€ ์š”์†Œ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
ย 

TF (Term Frequency)

๐Ÿ’ก
๋„ํ๋จผํŠธ ๋‚ด์— ๊ฒ€์ƒ‰๋œ ํ…€(term)์ด ๋” ๋งŽ์„์ˆ˜๋ก ์ ์ˆ˜๊ฐ€ ๋†’์•„์ง€๋Š” ๊ฒƒ์„ Term Frequency๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
ย 

IDF (Inverse Document Frequency)

๐Ÿ’ก
๊ฒ€์ƒ‰ํ•œ ํ…€์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋„ํ๋จผํŠธ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ๊ทธ ํ…€์˜ ์ž์‹ ์˜ ์ ์ˆ˜๊ฐ€ ๊ฐ์†Œํ•˜๋Š” ๊ฒƒ์„ Inverse Document Frequency๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด ํฌ์†Œํ•œ ๋‹จ์–ด๊ฐ€ ๊ฒ€์ƒ‰์— ๋” ์ค‘์š”ํ•œ ํ…€์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๋Š” ๋ง์ž…๋‹ˆ๋‹ค.
ย 

Field Length

๐Ÿ’ก
๋„ํ๋จผํŠธ์—์„œ ํ•„๋“œ ๊ธธ์ด๊ฐ€ ํฐ ํ•„๋“œ๋ณด๋‹ค๋Š” ์งง์€ ํ•„๋“œ์— ์žˆ๋Š” ํ…€์˜ ๋น„์ค‘์ด ๋” ํฝ๋‹ˆ๋‹ค. ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒ€์ƒ‰ํ•˜๋ ค๋Š” ๋‹จ์–ด๊ฐ€ ์ œ๋ชฉ๊ณผ ๋‚ด์šฉ ํ•„๋“œ์— ๋ชจ๋‘ ์žˆ๋Š” ๊ฒฝ์šฐ ํ…์ŠคํŠธ ๊ธธ์ด๊ฐ€ ๊ธด ๋‚ด์šฉ ํ•„๋“œ๋ณด๋‹ค๋Š” ํ…์ŠคํŠธ ๊ธธ์ด๊ฐ€ ์งง์€ ํ•„๋“œ์— ๊ฒ€์ƒ‰์–ด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ๊ฐ€ ๋” ์ ์ˆ˜๊ฐ€ ๋†’๊ฒŒ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
ย 

Bool : Should

๐Ÿ’ก
bool ์ฟผ๋ฆฌ์˜ should ๋Š” ๊ฒ€์ƒ‰ ์ ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์–ด์ง‘๋‹ˆ๋‹ค.
// fox ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ค‘ lazy๋ฅผ ํฌํ•จํ•œ ๊ฒฐ๊ณผ์— ๊ฐ€์ค‘์น˜ ๋ถ€์—ฌ GET my_index/_search { "query": { "bool": { "must": [ { "match": { "message": "fox" } } ], "should": [ { "match": { "message": "lazy" } } ] } } }
// ๊ฒฐ๊ณผ { "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 4, "relation" : "eq" }, "max_score" : 0.9489644, "hits" : [ { "_index" : "my_index", "_type" : "_doc", "_id" : "2", "_score" : 0.9489644, "_source" : { "message" : "The quick brown fox jumps over the lazy dog" } }, { "_index" : "my_index", "_type" : "_doc", "_id" : "1", "_score" : 0.32951736, "_source" : { "message" : "The quick brown fox" } } ] } }
ย 
should๋Š” match_phrase์™€ ํ•จ๊ป˜ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‡ผํ•‘๋ชฐ ์ƒํ’ˆ ๊ฒ€์ƒ‰ ๊ฐ™์€ ์‚ฌ๋ก€์—์„œ๋Š” ๋ณดํ†ต ๊ฒ€์ƒ‰์–ด๋กœ ์ž…๋ ฅ๋œ ๋‹จ์–ด๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ํฌํ•จ๋œ ๊ฒฐ๊ณผ๋“ค์„ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ค๋„๋ก ๋˜์–ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋•Œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ค‘์—์„œ ์ž…๋ ฅํ•œ ๊ฒ€์ƒ‰์–ด ์ „์ฒด ๋ฌธ์žฅ์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋งจ ์ƒ์œ„์— ์œ„์น˜์‹œํ‚ค๋ฉด ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋“ค์„ ๋ˆ„๋ฝ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ˆ˜์ค€ ๋†’์€ ํ’ˆ์งˆ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
ย 

์ •ํ™•๊ฐ’ ์ฟผ๋ฆฌ - Exact Value Query

๐Ÿ’ก
์ง€๊ธˆ๊นŒ์ง€์˜ ํ’€ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์€ ์Šค์ฝ”์–ด ์ ์ˆ˜ ๊ธฐ๋ฐ˜์œผ๋กœ relevancy๊ฐ€ ๋†’์€ ๊ฒฐ๊ณผ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ •ํ™•๊ฐ’ Exact Value๋ฅผ ํ†ตํ•ด ๊ฐ’์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ๋”ฐ์ง€๋Š” ๊ฒ€์ƒ‰์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Exact Value์—๋Š” term, range ์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ๋“ค์ด ์ด ๋ถ€๋ถ„์— ์†ํ•˜๋ฉฐ, ์Šค์ฝ”์–ด๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ณดํ†ต bool ์ฟผ๋ฆฌ์˜ filter ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๐Ÿ’ก
filter ์•ˆ์— ๋„ฃ์€ ๊ฒ€์ƒ‰ ์กฐ๊ฑด๋“ค์€ ์Šค์ฝ”์–ด๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์ง€๋งŒ ์บ์‹ฑ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฟผ๋ฆฌ๊ฐ€ ๋” ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

bool: filter

GET my_index/_search { "query": { "bool": { "must": [ { "match": { "message": "fox" } } ], "filter": [ { "match": { "message": "quick" } } ] } } }
ย 
๐Ÿ’ก
๊ฒฐ๋ก ์ ์œผ๋กœ filter๋Š” ๊ฒ€์ƒ‰์— ์กฐ๊ฑด์€ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ ์Šค์ฝ”์–ด์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ์ œ์–ดํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์‡ผํ•‘๋ชฐ์—์„œ ๊ฒ€์ƒ‰์–ด๋กœ ์ •ํ™•๋„๊ฐ€ ๋†’์€ ์ƒํ’ˆ๋ช…์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด์„œ ์ƒ์‚ฐ์—…์ฒด๋ฅผ ๋‹ค์‹œ ํ•„ํ„ฐ๋ง ํ•˜๋Š” ๋“ฑ์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
ย 

keyword

๐Ÿ’ก
๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋Š” keywordํ˜•์‹์œผ๋กœ ์ €์žฅํ•˜์—ฌ ์ •ํ™•๊ฐ’ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
GET my_index/_search { "query": { "bool": { "filter": [ { "match": { "message.keyword": "Brown fox brown dog" } } ] } } }
ย 

๋ฒ”์œ„ ์ฟผ๋ฆฌ - Range Query

๐Ÿ’ก
์ˆซ์ž, ๋‚ ์งœ ํ˜•์‹์€ range ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ๊ฒ€์ƒ‰์„ ํ•ฉ๋‹ˆ๋‹ค. range ์ฟผ๋ฆฌ๋Š” range : { <ํ•„๋“œ๋ช…>: { <ํŒŒ๋ผ๋ฉ”ํ„ฐ>:<๊ฐ’> } } ์œผ๋กœ ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค. range ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์•„๋ž˜์˜ 4๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • gte (Greater-than or equal to) - ์ด์ƒ (๊ฐ™๊ฑฐ๋‚˜ ํผ)
  • gt (Greater-than) โ€“ ์ดˆ๊ณผ (ํผ)
  • lte (Less-than or equal to) - ์ดํ•˜ (๊ฐ™๊ฑฐ๋‚˜ ์ž‘์Œ)
  • lt (Less-than) - ๋ฏธ๋งŒ (์ž‘์Œ)
ย 
// price ๊ฐ’์ด 700 ์ด์ƒ 900 ๋ฏธ๋งŒ์ธ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ GET phones/_search { "query": { "range": { "price": { "gte": 700, "lt": 900// 700 <= x < 900 } } } }
ย 

๋‚ ์งœ ๊ฒ€์ƒ‰

// 2016-01-01 ์ดํ›„์ธ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ GET phones/_search { "query": { "range": { "date": { "gt": "2016-01-01" } } } }
// ๋‚ ์งœ ํฌ๋ฉง์„ ๋‹ค๋ฅด๊ฒŒ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ format ์‚ฌ์šฉ GET phones/_search { "query": { "range": { "date": { "gt": "31/12/2015", "lt": "2018", "format": "dd/MM/yyyy||yyyy"// 2015๋…„ 12์›” 31์ผ ๋ถ€ํ„ฐ 2018๋…„ ์ด์ „ } } } } // date ๊ฐ’์ด 2016-01-01 ์˜ 6๊ฐœ์›” ํ›„ ๋ถ€ํ„ฐ ์˜ค๋Š˜ (2019-09-03) ์˜ 365์ผ ์ด์ „ ์‚ฌ์ด ๊ฐ’ ๊ฒ€์ƒ‰ GET phones/_search { "query": { "range": { "date": { "gt": "2016-01-01||+6M", "lt": "now-365d" } } } }
ย 
ย 

References::

ย 

Loading Comments...