同一字段上的 Elasticsearch 多个范围过滤器

ZeL*_*ubs 2 elasticsearch

我正在我正在处理的站点中实施 elasticseach 并尝试构建多范围过滤器。有 2 个字段具有我需要过滤的范围:价格和评级。每个人都应该能够一次选择多个范围。因此,例如,您应该能够按 80-85 OR90-95的评分进行过滤,同时还可以按 10-15 OR20-25的价格进行过滤。我正在使用post_filter术语和范围过滤器,因为我正在为搜索结果构建分面导航。您可以在下面看到我发送的结构化 json。

{
  "from": 0,
  "size": 15,
  "query": {
    "multi_match": {
      "query": "taz 2003",
      "type": "most_fields",
      "operator": "or",
      "fields": [
        "name",
        "vintage",
        "brand^4",
        "review"
      ],
      "fuzziness": "1"
    }
  },
  "post_filter": {
    "bool": {
      "must": [
        {
          "term": {
            "vintage": "2009"
          }
        }
      ],
      "should": [
        {
          "range": {
            "price": {
              "gte": 10,
              "lt": 15
            }
          }
        },
        {
          "range": {
            "price": {
              "gte": 20,
              "lt": 25
            }
          }
        },
        {
          "range": {
            "rating": {
              "gte": 80,
              "lt": 85
            }
          }
        },
        {
          "range": {
            "rating": {
              "gte": 90,
              "lt": 95
            }
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这几乎有效,但是因为所有范围都在一个shouldbool 过滤器内,它OR用于组合它们,所以它只匹配一个过滤器。我需要的是它执行以下操作(在 SQL 中):

SELECT * FROM `table` where 
vintage = 2009 AND
(
    (
        price BETWEEN 10 AND 15 OR
        price BETWEEN 20 AND 25
    ) AND
    (
        rating BETWEEN 80 AND 85 OR
        rating BETWEEN 90 AND 85
    )
);
Run Code Online (Sandbox Code Playgroud)

我目前对如何实现这一目标感到茫然。预先感谢您的帮助。

kee*_*ety 5

一种方法是nested boolmust

例子:

{
  "from": 0,
  "size": 15,
  "query": {
    "multi_match": {
      "query": "taz 2003",
      "type": "most_fields",
      "operator": "or",
      "fields": [
        "name",
        "vintage",
        "brand^4",
        "review"
      ],
      "fuzziness": "1"
    }
  },
  "post_filter": {
    "bool": {
      "must": [
        {
          "term": {
            "vintage": "2009"
          }
        },
        {
          "bool": {
            "should": [
              {
                "range": {
                  "price": {
                    "gte": 10,
                    "lt": 15
                  }
                }
              },
              {
                "range": {
                  "price": {
                    "gte": 20,
                    "lt": 25
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "should": [
              {
                "range": {
                  "rating": {
                    "gte": 80,
                    "lt": 85
                  }
                }
              },
              {
                "range": {
                  "rating": {
                    "gte": 90,
                    "lt": 95
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)