Post filter

Post filter

  在已经计算了聚合之后,post_filter应用于搜索请求最后的搜索匹配。其目的最好的例子如下:

  想像一下,您正在销售具有以下属性的衬衫:

PUT /shirts
{
    "mappings": {
        "item": {
            "properties": {
                "brand": { "type": "keyword"},
                "color": { "type": "keyword"},
                "model": { "type": "keyword"}
            }
        }
    }
}

PUT /shirts/item/1?refresh
{
    "brand": "gucci",
    "color": "red",
    "model": "slim"
}

  想象一下,用户已经指定了两个过滤器:

  color:red 和 brand:gucci.。您只想在搜索结果中显示Gucci制造的红色衬衫。通常你会用一个bool查询

GET /shirts/_search
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "color": "red"   }},
        { "term": { "brand": "gucci" }}
      ]
    }
  }
}

  但是,您也可以使用多面导航来显示用户可以点击的其他选项的列表。也许你有一个model字段,允许用户将他们的搜索结果限制在红色的Gucci t-shirts或dress-shirts上。

  这可以用术语聚合来完成:

GET /shirts/_search
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "color": "red"   }},
        { "term": { "brand": "gucci" }}
      ]
    }
  },
  "aggs": {
    "models": {
      "terms": { "field": "model" } 【1】
    }
  }
}

  【1】返回Gucci最受欢迎的红色衬衫款式。

  但也许您也想告诉用户Gucci衬衫有多少其他颜色。如果您只是在颜色字段中添加术语聚合,则只会返回颜色为红色,因为您的查询只返回Gucci的红色衬衫。

  相反,您要在聚合期间包括所有颜色的衬衫,然后将颜色过滤器应用于搜索结果。这是post_filter的目的:

GET /shirts/_search
{
  "query": {
    "bool": {
      "filter": {
        "term": { "brand": "gucci" } 【1】
      }
    }
  },
  "aggs": {
    "colors": {
      "terms": { "field": "color" } 【2】
    },
    "color_red": {【3】
      "filter": {
        "term": { "color": "red" } 
      },
      "aggs": {
        "models": {
          "terms": { "field": "model" } 
        }
      }
    }
  },
  "post_filter": { 【5】
    "term": { "color": "red" }
  }
}

  【1】主要查询现在找到Gucci的所有衬衫,不管颜色如何。

  【2】color聚合返回Gucci衬衫流行的颜色。

  【3】color_red agg将模型子聚合限制为红色Gucci衬衫。

  【4】最后,post_filter从搜索匹配中除去红色以外的颜色。

 

原文地址:https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-request-post-filter.html

转载于:https://www.cnblogs.com/benjiming/p/7235168.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值