过滤搜索结果

您可以使用不同的方法来过滤搜索,每种方法适用于特定场景。可以在查询级别、使用 boolean 查询子句、post_filter 以及聚合级别过滤器来应用过滤器,具体如下:

  • 查询级过滤: 应用 boolean 查询的过滤器子句来过滤搜索结果和聚合数据,例如将结果缩小到特定类别或品牌。

  • 后置过滤: 使用 post_filter 根据用户选择来优化搜索结果,同时保留所有聚合选项。

  • 聚合级过滤: 根据所选过滤器调整特定聚合,而不影响其他聚合。

使用布尔查询进行查询级过滤

使用带有过滤子句的 boolean 查询,将过滤器同时应用于搜索结果和聚合数据。例如,如果购物者搜索 BrandAsmartphones,布尔查询可以将结果限制为仅来自 BrandA 的智能手机。以下步骤指导您进行查询级过滤。

  1. 创建索引 electronics 并使用以下请求提供映射:

PUT /electronics
{
  "mappings": {
    "properties": {
      "brand": { "type": "keyword" },
      "category": { "type": "keyword" },
      "price": { "type": "float" },
      "features": { "type": "keyword" }
    }
  }
}
  1. 使用以下请求向 electronics 索引添加文档:

PUT /electronics/_doc/1?refresh
{
  "brand": "BrandA",
  "category": "Smartphone",
  "price": 699.99,
  "features": ["5G", "Dual Camera"]
}
PUT /electronics/_doc/2?refresh
{
  "brand": "BrandA",
  "category": "Laptop",
  "price": 1199.99,
  "features": ["Touchscreen", "16GB RAM"]
}
PUT /electronics/_doc/3?refresh
{
  "brand": "BrandB",
  "category": "Smartphone",
  "price": 799.99,
  "features": ["5G", "Triple Camera"]
}
  1. 应用 boolean 过滤查询,仅显示来自 BrandAsmartphones,使用以下请求:

GET /electronics/_search
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "brand": "BrandA" }},
        { "term": { "category": "Smartphone" }}
      ]
    }
  }
}

使用 post_filter 缩小结果范围,同时保留聚合可见性

使用 post_filter 来限制搜索结果,同时保留所有聚合选项。例如,如果购物者选择了 BrandA,结果将被过滤为仅显示 BrandA 的产品,同时在聚合中保持所有品牌选项的可见性,如下例请求所示:

GET /electronics/_search
{
  "query": {
    "bool": {
      "filter": { "term": { "category": "Smartphone" }}
    }
  },
  "aggs": {
    "brands": {
      "terms": { "field": "brand" }
    }
  },
  "post_filter": {
    "term": { "brand": "BrandA" }
  }
}

结果应在搜索结果中显示 BrandA 的智能手机,并在聚合中显示所有品牌。

使用聚合级过滤优化聚合

您可以使用聚合级过滤将过滤器应用于特定聚合,而不影响它们所属的主聚合。

例如,您可以使用聚合级过滤,根据所选品牌 BrandABrandB 来过滤 price_ranges 聚合,而不影响主 price_ranges 聚合,如下例请求所示。这将显示与所选品牌相关的价格范围,同时也显示所有产品的整体价格范围。

GET /electronics/_search
{
  "query": {
    "bool": {
      "filter": { "term": { "category": "Smartphone" }}
    }
  },
  "aggs": {
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 500 },
          { "from": 500, "to": 1000 },
          { "from": 1000 }
        ]
      }
    },
    "filtered_brands": {
      "filter": {
        "terms": { "brand": ["BrandA", "BrandB"] }
      },
      "aggs": {
        "price_ranges": {
          "range": {
            "field": "price",
            "ranges": [
              { "to": 500 },
              { "from": 500, "to": 1000 },
              { "from": 1000 }
            ]
          }
        }
      }
    }
  }
}