Bool 过滤器中的 Elasticsearch 术语和范围

Elasticsearch Term and Range in Bool Filter

我正在尝试按产品类型和价格范围过滤我的产品数据。我不想对我的结果进行评分,因此它们都可以是 0 或 1,我只需要结果集。

为什么我不能执行以下操作?这似乎完全合乎逻辑!

Elasticsearch 版本:5.5

GET my_store/products/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
           "productType": "cooker"
        },
        "range": {
           "price": {
             "gte": 10,
             "lte": 20
            }
         }
       }
     }
   }
}

当我执行这个时,我得到:

"[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]"

这大概意味着我在做一些语法错误的事情

  1. 这不符合逻辑结构吗?
  2. 好吧,就算错了,我也得去适应……那么正确的语法是什么?

这应该可以解决您的问题。我假设您的意思是在逻辑上与过滤器。如果您想对它们进行 OR,只需将 "must" 替换为 "should"。 一个很好的参考:https://www.elastic.co/guide/en/elasticsearch/guide/current/combining-filters.html

{
    "query": {
        "constant_score": {
            "filter": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "productType": "cooker"
                            }
                        },
                        {
                            "range": {
                                "price": {
                                    "gte": 10,
                                    "lte": 20
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}