过滤搜索结果
您可以使用不同的方法来过滤搜索,每种方法适用于特定场景。可以在查询级别、使用 boolean 查询子句、post_filter 以及聚合级别过滤器来应用过滤器,具体如下:
查询级过滤: 应用
boolean查询的过滤器子句来过滤搜索结果和聚合数据,例如将结果缩小到特定类别或品牌。后置过滤: 使用
post_filter根据用户选择来优化搜索结果,同时保留所有聚合选项。聚合级过滤: 根据所选过滤器调整特定聚合,而不影响其他聚合。
使用布尔查询进行查询级过滤
使用带有过滤子句的 boolean 查询,将过滤器同时应用于搜索结果和聚合数据。例如,如果购物者搜索 BrandA 的 smartphones,布尔查询可以将结果限制为仅来自 BrandA 的智能手机。以下步骤指导您进行查询级过滤。
创建索引
electronics并使用以下请求提供映射:
PUT /electronics
{
"mappings": {
"properties": {
"brand": { "type": "keyword" },
"category": { "type": "keyword" },
"price": { "type": "float" },
"features": { "type": "keyword" }
}
}
}
使用以下请求向
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"]
}
应用
boolean过滤查询,仅显示来自BrandA的smartphones,使用以下请求:
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 的智能手机,并在聚合中显示所有品牌。
使用聚合级过滤优化聚合
您可以使用聚合级过滤将过滤器应用于特定聚合,而不影响它们所属的主聚合。
例如,您可以使用聚合级过滤,根据所选品牌 BrandA 和 BrandB 来过滤 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 }
]
}
}
}
}
}
}