一、含义
单字符串查询:
Google 只提供一个输入框,查询相关的多个字段
支持按照价格,时间等进行过滤
二、单字符串查询实例
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
{
"query": {
"bool": {
"should": [
{ "match": { "title": "Brown fox" }},
{ "match": { "body": "Brown fox" }}
]
}
}
}
查询前预测分析:
- 博客标题
文档1中出现 “Brown” - 博客内容
文档1中出现了“Brown”
“Brown fox” 在文档2中全部出现,并且保持一致的顺序(目测相关性最高)
三、算分过程
- 查询should 语句中的两个查询
- 加和两个查询的评分
- 乘以匹配语句的总数
- 除以所有语句的总数
四、查询结果及分析
文档1中 只有title中含有Brown,文档2中title和body都有Brown,所以 文档2的分数高
五、Disjunction Max Query查询
- 上例中,title和body相互竞争,不应该将分数简单叠加,⽽是应该找到单个最佳匹配的字段的评分
- DisjunctionMaxQuery --- 最佳字段查询
将任何与任⼀查询匹配的⽂档作为结果返回。采⽤字段上最匹配的评分最终评分返回
POST blogs/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Quick pets" }},
{ "match": { "body": "Quick pets" }}
]
}
}
}
image.png
- 有⼀些情况下,同时匹配title和body字段的⽂档⽐只与⼀个字段匹配的⽂档的相关度更⾼
- 但disjunctionmaxquery查询只会简单地使⽤单个最佳匹配语句的评分_score作为整体评分。怎么办?
六、最佳字段查询调优
通过TieBreaker参数调整
POST blogs/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Quick pets" }},
{ "match": { "body": "Quick pets" }}
],
"tie_breaker": 0.2
}
}
}
image.png
- 获得最佳匹配语句的评分_score。
- 将其他匹配语句的评分与tie_breaker相乘
- 对以上评分求和并规范化
●TierBreaker是⼀个介于0-1之间的浮点数。0代表使⽤最佳匹配;1代表所有语句同等重要。
tie_breaker 参数提供了一种 dis_max 和 bool 之间的折中选择,它的评分方式如下:
- 获得最佳匹配语句的评分 _score 。
- 将其他匹配语句的评分结果与 tie_breaker 相乘。
- 对以上评分求和并规范化。
tie_breaker 可以是 0 到 1 之间的浮点数,其中 0 代表使用 dis_max 最佳匹配语句的普通逻辑, 1 表示所有匹配语句同等重要。最佳的精确值需要根据数据与查询调试得出,但是合理值应该与零接近(处于 0.1 - 0.4 之间),这样就不会颠覆 dis_max 最佳匹配性质的根本。
网友评论