4.5-单字符串多字段查询-DisMaxQuery
2020-04-01 本文已影响0人
落日彼岸
单字符串查询的实例
-
博客标题
- ⽂档 1 中出现 “Brown”
-
博客内容
-
⽂档 1 中出现了 “Brown”
-
“Brown fox” 在⽂档 2 中全部出现,并且保持和查询⼀致的顺序(⽬测相关性最⾼)
-
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."
}
POST /blogs/_search
{
"explain": true,
"query": {
"bool": {
"should": [
{ "match": { "title": "Brown fox" }},
{ "match": { "body": "Brown fox" }}
]
}
}
}
算分过程
-
查询 should 语句中的两个查询
-
加和两个查询的评分
-
乘以匹配语句的总数
-
除以所有语句的总数
查询结果及分析
查询结果
Disjunction Max Query 查询
-
上例中,title 和 body 相互竞争
- 不应该将分数简单叠加,⽽是应该找到单个最佳匹配的字段的评分
-
Disjunction Max Query
- 将任何与任⼀查询匹配的⽂档作为结果返回。采⽤字段上最匹配的评分最终评分返回
Disjunction Max Query 查询
POST blogs/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Brown fox" }},
{ "match": { "body": "Brown fox" }}
]
}
}
}
image.png
最佳字段查询调优
POST blogs/_search
{
"explain": true,
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Quick pets" }},
{ "match": { "body": "Quick pets" }}
]
}
}
}
image.png
- 有⼀些情况下,同时匹配 title 和 body 字段的 ⽂档⽐只与⼀个字段匹配的⽂档的相关度更⾼
- 但 disjunction max query 查询只会简单地使 ⽤单个最佳匹配语句的评分 _score 作为整体评分。怎么办?
通过 Tie Breaker 参数调整
POST blogs/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Quick pets" }},
{ "match": { "body": "Quick pets" }}
],
"tie_breaker": 0.2
}
}
}
image.png
-
获得最佳匹配语句的评分 _score 。
-
将其他匹配语句的评分与 tie_breaker 相乘
-
对以上评分求和并规范化
Tier Breaker 是⼀个介于 0-1 之间的浮点数。0 代表使⽤最佳匹配;1 代表所有语句同等重要。
本节知识点回顾
-
使⽤ bool 查询实现单字符串多字段查询
-
单字符串多字段查询时,如何在多个字段上进⾏算分
-
复合查询:Disjunction Max Query
-
将评分最⾼的字段评分作为结果返回,满⾜两个字段是竞争关系的场景
-
对最佳字段查询进⾏调优:通过控制 Tie Breaker 参数,引⼊其他字段对算分的⼀些影响
课程demo
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."
}
POST /blogs/_search
{
"explain": true,
"query": {
"bool": {
"should": [
{ "match": { "title": "Brown fox" }},
{ "match": { "body": "Brown fox" }}
]
}
}
}
POST blogs/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Brown fox" }},
{ "match": { "body": "Brown fox" }}
]
}
}
}
POST blogs/_search
{
//"explain": true,
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Quick pets" }},
{ "match": { "body": "Quick pets" }}
]
}
}
}
POST blogs/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Quick pets" }},
{ "match": { "body": "Quick pets" }}
],
"tie_breaker": 0.2
}
}
}
相关阅读