Elasticsearch中Bool 查询实际应用场景详解
下面我将详细解析这两个 Bool 查询的实际应用场景示例,帮助您更好地理解其组成部分和业务逻辑。
1. 电商产品搜索示例详解
GET /products/_search
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "智能手机 高性能",
"fields": ["name^3", "description"]
}
}
],
"filter": [
{
"term": {
"brand.keyword": "华为"
}
},
{
"range": {
"price": {
"gte": 2000,
"lte": 6000
}
}
},
{
"term": {
"in_stock": true
}
}
],
"should": [
{
"term": {
"tags.keyword": "新款"
}
},
{
"term": {
"tags.keyword": "热销"
}
}
]
}
}
}
业务场景解析
这是一个典型的电商网站产品搜索场景,用户在搜索框中输入"智能手机 高性能",并通过筛选条件选择了华为品牌、2000-6000元价格区间、只看有货商品。
查询组成部分详解
1. must
子句 - 核心搜索条件(影响相关性评分)
"must": [
{
"multi_match": {
"query": "智能手机 高性能",
"fields": ["name^3", "description"]
}
}
]
功能:执行全文搜索,查找包含"智能手机"和"高性能"的产品
字段:同时搜索
name
和description
两个文本字段权重:
name^3
表示产品名称字段的权重是描述字段的 3 倍业务意义:确保返回的结果与用户搜索词相关,优先考虑产品名称匹配的结果
2. filter
子句 - 精确筛选条件(不影响评分)
"filter": [
{
"term": {
"brand.keyword": "华为"
}
},
{
"range": {
"price": {
"gte": 2000,
"lte": 6000
}
}
},
{
"term": {
"in_stock": true
}
}
]
品牌筛选:
brand.keyword: "华为"
- 只返回华为品牌的产品价格范围:
price: {"gte": 2000, "lte": 6000}
- 只返回价格在 2000-6000 元之间的产品库存状态:
in_stock: true
- 只返回有库存的产品业务意义:这些是用户通过筛选项选择的硬性条件,必须精确匹配,不需要考虑相关性评分
3. should
子句 - 偏好条件(提高评分但不强制要求)
"should": [
{
"term": {
"tags.keyword": "新款"
}
},
{
"term": {
"tags.keyword": "热销"
}
}
]
功能:提升带有"新款"或"热销"标签的产品排名
业务意义:在满足必要条件的产品中,优先展示新上市或热销的产品,提高用户转化率
整体查询逻辑
这个查询的逻辑可以表述为:
查找名称或描述中包含"智能手机"和"高性能"的华为品牌产品,价格在 2000-6000 元之间且有库存,同时优先展示标记为"新款"或"热销"的产品。
2. 内容推荐系统示例详解
GET /articles/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"content": "人工智能 机器学习"
}
}
],
"filter": [
{
"range": {
"publish_date": {
"gte": "now-30d"
}
}
}
],
"should": [
{
"term": {
"author.keyword": "张三"
}
},
{
"terms": {
"tags.keyword": ["AI", "深度学习", "神经网络"]
}
}
],
"must_not": [
{
"term": {
"is_draft": true
}
}
]
}
}
}
业务场景解析
这是一个内容平台(如技术博客、新闻网站)的文章推荐场景,系统需要根据用户兴趣(人工智能和机器学习)推荐相关的最新文章。
查询组成部分详解
1. must
子句 - 核心内容匹配(影响相关性评分)
"must": [
{
"match": {
"content": "人工智能 机器学习"
}
}
]
功能:查找内容中包含"人工智能"和"机器学习"的文章
业务意义:确保推荐的文章与用户的核心兴趣主题相关
2. filter
子句 - 时间限制(不影响评分)
"filter": [
{
"range": {
"publish_date": {
"gte": "now-30d"
}
}
}
]
功能:只返回最近 30 天发布的文章
业务意义:确保推荐的是新鲜内容,避免向用户推荐过时的文章
3. should
子句 - 偏好提升(提高评分但不强制要求)
"should": [
{
"term": {
"author.keyword": "张三"
}
},
{
"terms": {
"tags.keyword": ["AI", "深度学习", "神经网络"]
}
}
]
作者偏好:提升特定作者(张三)的文章排名
相关标签:提升带有特定标签(AI、深度学习、神经网络)的文章排名
业务意义:
可能是基于用户历史行为分析,用户更喜欢张三的文章
或者这些标签与用户兴趣高度相关,能提供更精准的推荐
4. must_not
子句 - 排除条件
"must_not": [
{
"term": {
"is_draft": true
}
}
]
功能:排除草稿状态的文章
业务意义:确保只推荐已发布的正式内容,避免向用户展示未完成的文章
整体查询逻辑
这个查询的逻辑可以表述为:
查找内容中包含"人工智能"和"机器学习"的最近 30 天发布的正式文章,同时优先推荐张三撰写的文章或带有 AI、深度学习、神经网络等标签的文章。
两个示例的共同特点与区别
共同特点
复合查询结构:都使用 Bool 查询组合多个条件
评分与过滤分离:
must
和should
用于影响相关性评分filter
和must_not
用于精确过滤,不影响评分
业务逻辑清晰:查询结构反映了明确的业务需求和用户意图
主要区别
应用场景不同:
示例 1:电商产品搜索,偏重精确的属性筛选
示例 2:内容推荐,偏重内容相关性和时效性
查询字段类型不同:
示例 1:混合了文本字段(name, description)和结构化字段(price, in_stock)
示例 2:主要针对文本内容和时间字段
业务目标不同:
示例 1:帮助用户快速找到符合条件的商品,促进交易
示例 2:向用户推荐感兴趣的内容,提高用户粘性
总结
这两个 Bool 查询示例展示了 Elasticsearch 在不同业务场景下的强大灵活性:
电商产品搜索:结合全文搜索与精确属性筛选,平衡相关性和精确匹配
内容推荐系统:结合内容相关性、时效性和用户偏好,提供个性化推荐
Bool 查询的优势在于能够将复杂的业务逻辑转化为结构化的查询条件,同时区分哪些条件影响相关性评分,哪些只是硬性过滤条件,从而实现既精确又灵活的搜索体验。