案例:搜索title或content中包含java beginner的帖子
GET /forum/article/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "java beginner" }},
{ "match": { "body": "java beginner" }}
]
}
}
}
可能出現的場景如下:
(1)某個帖子,doc1,title中包含java,content不包含java beginner任何一個關鍵詞
(2)某個帖子,doc2,content中包含beginner,title中不包含任何一個關鍵詞
(3)某個帖子,doc3,title中包含java,content中包含beginner
(4)最終搜索,可能出來的結果是,doc1和doc2排在doc3的前面,而不是我們期望的doc3排在最前面
dis_max,只是取分數最高的那個query的分數,對於(1)(2)(3)這三個場景,dis_max的值是一樣的,所以可能出現(4)的結果。
使用tie_breaker將其他query的分數也考慮進去
tie_breaker參數的意義,在於說,將其他query的分數(即最大分數之外的分數),乘以tie_breaker,然後與最高分數的那個query的分數,綜合在一起進行計算,也就是說,除了取最高分以外,還會考慮其他的query的分數
tie_breaker的值,在0~1之間,是個小數,就ok
GET /forum/article/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "java beginner" }},
{ "match": { "body": "java beginner" }}
],
"tie_breaker": 0.3
}
}
}
multi_match案例:
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
}
}
}
minimum_should_match:控制搜索的精確度,只有匹配一定數量的關鍵詞數據才能返回。作用:去長尾
長尾,比如你搜索5個關鍵詞,但是很多結果是隻匹配1個關鍵詞的,其實跟你想要的結果相差甚遠,這些結果就是長尾