簡體   English   中英

Elasticsearch 返回大於指定范圍的結果

[英]Elasticsearch returns results greater than specified in range

我將Elasticsearch (版本:6.8.4)與MongoDB (4.0.3)一起使用

我想找到價格在 1 到 800 之間且 sale_date 大於 Date.now() 的所有文檔,但我的查詢有問題:

{
  "query": {
    "bool": {
      "must": [],
      "filter": {
        "term": { 
          "sold_out": false 
        },
        "bool": {
          "should": [
            {
              "range": {
                "sale_date": {
                  "gt": Date.now()
                }
              }
            },
            {
              "range": {
                "price": {
                  "gt": 1,
                  "lte": 800
                }
              }
            }
          ]
        }
      }
    }
  },
  "from": 10,
  "size": 200
}

它的查詢返回我的結果,其中一些產品的價格大於 800

價格字段存儲在Elasticsearch只要

我想試試:

  • 使用 from: to: 並得到相同的結果
  • 將過濾器中的“應該”更改為“必須”,它返回空結果
  • 從查詢中刪除 { "range": { "sale_date": { "gt": Date.now(), } } } 並返回正確的結果!

我做錯了什么?

首先刪除兩個 bool 對象的不必要嵌套,嘗試像這樣將所有子句放在同一個“bool”字段中。

記住 with must一個文件必須有你正在做比較的術語才能包含在結果中,如果匹配只會提高分數,如果條件滿足,所以在某種意義上must 就像 AND並且應該類似於 OR

在您的示例中,將過濾器從 should 更改為 must 使查詢不返回任何內容,這可能是因為您沒有任何包含您想要的日期和價格的元素,或者可能是布爾嵌套的問題。

嘗試這個:

{
  "query": {
    "bool": {
      "must": [{
        "range": {
          "sale_date": {
            "gt": Date.now()
          }
        }
      },
      {
        "range": {
          "price": {
            "gt": 1,
            "lte": 800
          }
        }
      }],
        "filter": {
        "term": {
          "sold_out": false
        },
      }
    }
  },
  "from": 10,
  "size": 200
}

這只會得到價格為 lte 800 和 sale_date gt Date.now() 的元素。

將 Date().now() 更改為“gt”:“now/d”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM