1. 程式人生 > >11.best fields策略(dis_max參數設置)

11.best fields策略(dis_max參數設置)

一位 計算 cor left write solution 們的 score 策略

主要知識點

  • 常規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、搜索titlecontent中包含javasolution的帖子

GET /forum/article/_search

{

"query": {

"bool": {

"should": [

{ "match": { "title": "java solution" }},

{ "match": { "content": "java solution" }}

]

}

}

}

2、結果分析

期望的排在第一位是doc5,結果是doc2,doc4排在了前面。原因如下:

計算每個documentrelevance score的方式是:每個query的分數,乘以matched query數量,除以總query數量

算一下doc4的分數

{ "match": { "title": "java solution" }},針對doc4,是有一個分數的,假設是1.1

{ "match": { "content": "java solution" }},針對doc4,也是有一個分數的,假設是1.2

所以是兩個分數加起來是2.3matched 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參數設置)