基于dis_max實現best fields策略進行多字段搜索

1、為帖子數據增加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"} }

2、搜索title或content中包含java或solution的帖子

下面這個就是multi-field搜索,多字段搜索

GET /forum/article/_search
{
    "query": {
        "bool": {
            "should": [
                { "match": { "title": "java solution" }},
                { "match": { "content":  "java solution" }}
            ]
        }
    }
}

3、結果分析

期望的是doc5,結果是doc2,doc4排在了前面

計算每個document的relevance score:每個query的分數,乘以matched query數量,除以總query數量

算一下doc4的分數

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

所以是兩個分數加起來,比如說,1.1 + 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,是有一個分數的

所以說,只有一個query是有分數的,比如2.3
matched query數量 = 1
總query數量 = 2

2.3 * 1 / 2 = 1.15

doc5的分數 = 1.15 < doc4的分數 = 2.3

4、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

然后doc4的分數 = 1.2 < doc5的分數 = 2.3,所以doc5就可以排在更前面的地方,符合我們的需要

GET /forum/article/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "java solution" }},
                { "match": { "content":  "java solution" }}
            ]
        }
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容