Link Search Menu Expand Document Documentation Menu

筛选搜索结果

您可以使用不同的方法筛选搜索,每种方法都适用于特定的场景。您可以按查询级别应用筛选,使用 boolean 查询子句以及 post_filteraggregation 级别的筛选器,具体如下:

  • 查询级别筛选: 应用 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 }
            ]
          }
        }
      }
    }
  }
}

剩余 350 字符

有问题?

想要贡献?