11.best fields策略(dis_max參數設置)
主要知識點
- 常規multi-field搜索結果分析
- dis_max參數設置
一、為帖子數據增加content字段
POST /forum/article/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"content" : "i like to write best elasticsearch article"} }
{ "update": { "_id": "2"} }
{ "doc" : {"content" : "i think java is the best programming language"} }
{ "update": { "_id": "3"} }
{ "doc" : {"content" : "i am only an elasticsearch beginner"} }
{ "update": { "_id": "4"} }
{ "doc" : {"content" : "elasticsearch and hadoop are all very good solution, i am a beginner"} }
{ "update": { "_id": "5"} }
{ "doc" : {"content" : "spark is best big data solution based on scala ,an programming language similar to java"} }
二、多字段搜索(multi-field搜索)
1、搜索title或content中包含java或solution的帖子
GET /forum/article/_search
{
"query": {
"bool": {
"should": [
{ "match": { "title": "java solution" }},
{ "match": { "content": "java solution" }}
]
}
}
}
2、結果分析
期望的排在第一位是doc5,結果是doc2,doc4排在了前面。原因如下:
計算每個document的relevance score的方式是:每個query的分數,乘以matched query數量,除以總query數量
算一下doc4的分數
{ "match": { "title": "java solution" }},針對doc4,是有一個分數的,假設是1.1
{ "match": { "content": "java solution" }},針對doc4,也是有一個分數的,假設是1.2
所以是兩個分數加起來是2.3,matched query數量 = 2,總query數量 = 2,計算的分數就是2.3 * 2 / 2 = 2.3
算一下doc5的分數
{ "match": { "title": "java solution" }},針對doc5,是沒有分數的
{ "match": { "content": "java solution" }},針對doc5,是有一個分數,假設是2.3
matched query數量 = 1,總query數量 = 2,計算的分數就是2.3 * 1 / 2 = 1.15
通過計算發現:doc4兩個field匹配到一個關鍵詞,分數反而高,doc5一個field匹配到兩個關鍵詞,分數反而低了,這樣不符合我們的預期。
三、best fields策略(dis_max參數設置)
best fields策略,就是說,搜索到的結果中,如果某一個field中匹配到了盡可能多的關鍵詞,那麽就應被排在前面;而不是盡可能多的field匹配到了少數的關鍵詞排在前面。
dis_max語法,直接取多個query中,分數最高的那一個query的分數即可。
{ "match": { "title": "java solution" }},針對doc4,是有一個分數的,1.1
{ "match": { "content": "java solution" }},針對doc4,也是有一個分數的,1.2
取最大分數,1.2
{ "match": { "title": "java solution" }},針對doc5,是沒有分數的
{ "match": { "content": "java solution" }},針對doc5,是有一個分數的,2.3
取最大分數,2.3
所以doc5就可以排在更前面的地方,符合我們的需要。
語法:
GET /forum/article/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "java solution" }},
{ "match": { "content": "java solution" }}
]
}
}
}
另一種寫法:結果是一樣的。
GET /forum/article/_search
{
"query": {
"dis_max": {
"tie_breaker": 0.7,
"boost": 1.2,
"queries": [
{"bool": {"should": [
{"match": {"title": "java solution"}},
{"match": {"content": "java solution"}}
]
}
}]
}
}
11.best fields策略(dis_max參數設置)