dis_max和tie_break 查询字段最佳匹配
best fields策略,dis_max
best fields策略,就是说,搜索到的结果,应该是某一个field中匹配到了尽可能多的关键词,被排在前面;而不是尽可能多的field匹配到了少数的关键词,排在了前面,dis_max就是best fields 策略
1、dis_max查询只是简单的使用最佳匹配查询子句得到的_score. 将其它匹配的查询子句考虑进来也是可能的。通过指定tie_breaker参数.
dis_max 是同一字段出现所有查询关键字时得分会最高。 而指定tie_breaker 系数指定同一份id下跨字段匹配也考虑进来。
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Quick pets" }},
{ "match": { "body": "Quick pets" }}
],
"tie_breaker": 0.3
}
}
}
原文链接:https://blog.csdn.net/m0_37139189/article/details/83339833
2、dis_max只取某一个query最大的分数,完全不考虑其他query的分数
3、使用tie_breaker将其他query的分数也考虑进去
tie_breaker参数的意义,在于说,将其他query的分数,乘以tie_breaker,然后综合与最高分数的那个query的分数,综合在一起进行计算
除了取最高分以外,还会考虑其他的query的分数
tie_breaker的值,在0~1之间,是个小数,就ok
GET /_search
{
"query": {
"dis_max": {
"queries": [
{"match": {"title":"人马"}},
{"match": {"body":"改革春风"}}
],
"tie_breaker":0.3
}
}
参考https://blog.csdn.net/gwd1154978352/article/details/83856927
4、基于multi_match语法实现dis_max和tie_breaker
这边的title^2表示把title这个字段设置boost为2(权重默认是1)
minimum_should_match在之前的ElasticSearch教程——精准全文检索一文中已经说过,是用来控制搜索结果的精准度,只有匹配一定数量的关键词的数据,才能返回
GET/forum/article/_search
{
"query": {
"multi_match": {
"query":"java solution",
"type":"best_fields",
"fields": ["title^2","content"],
"tie_breaker":0.3,
"minimum_should_match":"50%"
}
}
上面的举例和下面的这个结果是一样的?
GET
/forum/article/_search
{
"query": {
"dis_max": {
"queries": [
{
"match": {
"title": {
"query":"java beginner",
"minimum_should_match":"50%",
"boost":2
}
}
},
{
"match": {
"body": {
"query":"java beginner",
"minimum_should_match":"30%"
}
}
}
],
"tie_breaker":0.3
}
}
}
5、搜索title或content中包含java或solution的帖子
下面这个就是multi-field搜索,多字段搜索, bool查询时多字段搜索,不是best_fields 搜索
GET/forum/article/_search
{
"query": {
"bool": {
"should": [
{"match": {"title":"java solution"}},
{"match": {"content":"java solution"}}
]
}
}
}