我正在嘗試撰寫一個包含以下邏輯的查詢:
if `ts` is greater than or equal to "2021-05-01T04:00:00Z" and less than "2021-10-01T04:00:00Z"
AND
the field data.data1 exists
OR
the field data.data2 exists
OR
the field data.data3 exists
OR
the field data.data4 exists
然后計算索引中的記錄數 get_test
這是我正在使用的查詢:
GET /get_test/_count
{
"query":{
"bool": {
"must": [
{"range": {"ts": {"gte": "2021-05-01T04:00:00Z", "lt": "2021-10-01T04:00:00Z"}}},
{"exists": {"field": "data.data1"}},
{"exists": {"field": "data.data2"}},
{"exists": {"field": "data.data4"}},
{"exists": {"field": "data.data3"}}
]
}
}
}
此查詢在 Elastic 開發工具中執行,但回傳 0 個結果,但存在與上述邏輯匹配的記錄。每次呼叫之間似乎都有一個隱含的 AND :
{"exists": {"field": "data.data1"}},
{"exists": {"field": "data.data2"}},
{"exists": {"field": "data.data4"}},
{"exists": {"field": "data.data3"}}
我需要對彈性查詢進行哪些更改才能啟用上述邏輯?有沒有辦法OR在每個存在子句之間定義一個?
uj5u.com熱心網友回復:
如果您有datatype欄位nested,則必須在nested查詢下具有所有這些條件:
{
"query": {
"bool": {
"must": [
{
"range": {
"ts": {
"gte": "2021-05-01T04:00:00Z",
"lt": "2021-10-01T04:00:00Z"
}
}
},
{
"nested": {
"path": "data",
"query": {
"should": [
{
"exists": {
"field": "data.data1"
}
},
{
"exists": {
"field": "data.data2"
}
},
{
"exists": {
"field": "data.data4"
}
},
{
"exists": {
"field": "data.data3"
}
}
]
}
}
}
]
}
}
}
請注意,在nested查詢下,我使用了should代替must,因為您只需要存在這些欄位之一 ( OR)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/352735.html
標籤:弹性搜索
