bool 查询 | should 子句 | 举例分析
数据准备 | blogs
PUT /blogs/_doc/1
{
"title": "Quick brown rabbits",
"body": "Brown rabbits are commonly seen."
}
PUT /blogs/_doc/2
{
"title": "Keeping pets healthy",
"body": "My quick brown fox eats rabbits on a regular basis."
}
bool 查询 | should 子句
- id 为 1 的文档的算分高;
- 因为 id 为 1 的文档在 title 和 body 字段中都获得算分,id 为 2 的文档只在 body 字段中获得算分;
- 尽管 id 为 2 的文档从语义上的匹配度是更高的;
POST /blogs/_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "Brown fox" }},
{ "match": { "body": "Brown fox" }}
]
}
}
}
bool 查询 | should 子句 | 算分过程
- 查询 should 语句中的两个查询;
- 加和两个查询的评分;
- 乘以匹配语句的总数;
- 除以所有语句的总和;
Disjunction Max Query 查询
- 在上例中,title 和 body 相互竞争,不应该将分数简单叠加,而是应该找到单个最佳匹配的字段的评分;
- Disjunction Max Query 将某个字段上算分最高的算分作为文档的算分;
Disjunction Max Query 查询 | 举例
搜索关键词 "Brown fox"
- id 为 2 的文档的 body 字段完全匹配到了关键词 "Brown fox",所以其算分最高;
POST /blogs/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Brown fox" }},
{ "match": { "body": "Brown fox" }}
]
}
}
}
搜索关键词 "Quick pets"
- 虽然 id 为 2 的文档的两个字段分别匹配到了关键词中的一个,但是每个字段的算分和只有一个字段匹配到关键词中的一个的 id 为 1 的文档是一样的,所以两个文档的算分是一样的;
POST blogs/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Quick pets" }},
{ "match": { "body": "Quick pets" }}
]
}
}
}
搜索关键词 "Quick pets" | tie_breaker
- tie_breaker 是一个介于 0-1 之间的浮点数,0 代表使用最佳匹配,1 代表所有语句同等重要;
- tie_breaker 的作用是:除了取最高分以外,还会考虑其他字段的分数,具体算法是,其余字段的算分 * tie_breaker,再加到最高分字段的算分上去;
POST blogs/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Quick pets" }},
{ "match": { "body": "Quick pets" }}
],
"tie_breaker": 0.2
}
}
}