筛选搜索结果
您可以使用不同的方法筛选搜索,每种方法都适用于特定的场景。您可以按查询级别应用筛选,使用 boolean
查询子句以及 post_filter
和 aggregation
级别的筛选器,具体如下:
- 查询级别筛选: 应用
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 }
]
}
}
}
}
}
}