二十硝全、Elasticsearch混合使用match和match_phrase實現(xiàn)召回率與精準度的平衡

1栖雾、什么是召回率?

比如你搜索一個java spark伟众,總共有100個doc析藕,能返回多少個doc作為結果,就是召回率凳厢,recall

2账胧、什么是精準度?

比如你搜索一個java spark先紫,能不能盡可能讓包含java spark或者是java和spark離的很近的doc排在最前面治泥,precision直接用match_phrase短語搜索,會導致必須所有term都在doc field中出現(xiàn)遮精,而且距離在slop限定范圍內(nèi)才能匹配上居夹。

match_phrase,proximity match要求doc必須包含所有的term,才能作為結果返回;如果某一個doc可能就是有某個term沒有包含吮播,那么就無法作為結果返回变屁。

比如:
java spark --》 hello world java : 就無法匹配到
java spark --》 hello world,java spark : 可以匹配到

3意狠、疑問
近似匹配的時候粟关,召回率比較低,精準度太高了环戈,但是有時我們希望的是匹配到幾個term中的部分闷板,就可以作為結果出來,這樣可以提高召回率院塞,同時我們也希望用上match_phrase根據(jù)距離提升分數(shù)的功能遮晚,讓幾個term距離越近分數(shù)就越高,越優(yōu)先返回拦止。

就是優(yōu)先滿足召回率县遣。比如
java spark --》 包含java的返回,包含spark的也返回汹族,包含 java和spark的也返回萧求,同時兼顧精準度,就是包含java和spark顶瞒,同時java和spark距離越近的doc排最前面夸政。

4、解決疑問
可以用bool組合match query和match_phrase query一起榴徐,來實現(xiàn)上述效果守问。

match提高召回率,帶java和帶spark的都要返回坑资。
match_phrase提高精準度耗帕,保證同時帶java和spark的排在最前面。

效果1:直接用bool match query

GET /forum/article/_search 
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "content": "java spark"
          }
        }
      ]
    }
  }
}

結果

{
  "took": 54,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.68640786,
    "hits": [
      {
        "_index": "forum",
        "_type": "article",
        "_id": "2",
        "_score": 0.68640786,
        "_source": {
          "articleID": "KDKE-B-9947-#kL5",
          "userID": 1,
          "hidden": false,
          "postDate": "2017-01-02",
          "tag": [
            "java"
          ],
          "tag_cnt": 1,
          "view_cnt": 50,
          "title": "this is java blog",
          "content": "i think java is the best programming language",
          "sub_title": "learned a lot of course",
          "author_first_name": "Smith",
          "author_last_name": "Williams",
          "new_author_last_name": "Williams",
          "new_author_first_name": "Smith"
        }
      },
      {
        "_index": "forum",
        "_type": "article",
        "_id": "5",
        "_score": 0.68324494,
        "_source": {
          "articleID": "DHJK-B-1395-#Ky5",
          "userID": 3,
          "hidden": false,
          "postDate": "2017-03-01",
          "tag": [
            "elasticsearch"
          ],
          "tag_cnt": 1,
          "view_cnt": 10,
          "title": "this is spark blog",
          "content": "spark is best big data solution based on scala ,an programming language similar to java spark",
          "sub_title": "haha, hello world",
          "author_first_name": "Tonny",
          "author_last_name": "Peter Smith",
          "new_author_last_name": "Peter Smith",
          "new_author_first_name": "Tonny"
        }
      }
    ]
  }
}

結果發(fā)現(xiàn)單獨包含java和spark的也被返回了,而且單獨包含java的卻排到了第一位,既包含java又包含spark的卻排到了最后茵汰。

效果2:直接用match_phrase

GET /forum/article/_search 
{
  "query": {
    "match_phrase": {
      "content": {
        "query": "java spark",
        "slop" : 50
      }
    }
  }
}

結果:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "forum",
        "_type": "article",
        "_id": "5",
        "_score": 0.5753642,
        "_source": {
          "articleID": "DHJK-B-1395-#Ky5",
          "userID": 3,
          "hidden": false,
          "postDate": "2017-03-01",
          "tag": [
            "elasticsearch"
          ],
          "tag_cnt": 1,
          "view_cnt": 10,
          "title": "this is spark blog",
          "content": "spark is best big data solution based on scala ,an programming language similar to java spark",
          "sub_title": "haha, hello world",
          "author_first_name": "Tonny",
          "author_last_name": "Peter Smith",
          "new_author_last_name": "Peter Smith",
          "new_author_first_name": "Tonny"
        }
      }
    ]
  }
}

結果發(fā)現(xiàn)只返回了既包含java又包含spark的數(shù)據(jù)涉枫,召回率降低了。

最終效果:我們將兩個結果合并狡赐,既用bool match query又用match_phrase

GET /forum/article/_search 
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "content": "java spark"
          }
        }
      ],
      "should": [
        {
          "match_phrase": {
            "content": {
              "query": "java spark",
              "slop" : 50
            }
          }
        }
      ]
    }
  }
}

結果:

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 1.258609,
    "hits": [
      {
        "_index": "forum",
        "_type": "article",
        "_id": "5",
        "_score": 1.258609,
        "_source": {
          "articleID": "DHJK-B-1395-#Ky5",
          "userID": 3,
          "hidden": false,
          "postDate": "2017-03-01",
          "tag": [
            "elasticsearch"
          ],
          "tag_cnt": 1,
          "view_cnt": 10,
          "title": "this is spark blog",
          "content": "spark is best big data solution based on scala ,an programming language similar to java spark",
          "sub_title": "haha, hello world",
          "author_first_name": "Tonny",
          "author_last_name": "Peter Smith",
          "new_author_last_name": "Peter Smith",
          "new_author_first_name": "Tonny"
        }
      },
      {
        "_index": "forum",
        "_type": "article",
        "_id": "2",
        "_score": 0.68640786,
        "_source": {
          "articleID": "KDKE-B-9947-#kL5",
          "userID": 1,
          "hidden": false,
          "postDate": "2017-01-02",
          "tag": [
            "java"
          ],
          "tag_cnt": 1,
          "view_cnt": 50,
          "title": "this is java blog",
          "content": "i think java is the best programming language",
          "sub_title": "learned a lot of course",
          "author_first_name": "Smith",
          "author_last_name": "Williams",
          "new_author_last_name": "Williams",
          "new_author_first_name": "Smith"
        }
      }
    ]
  }
}

結果發(fā)現(xiàn)非常完美窑业,兩個都包含的排到了第一位,并且分數(shù)遠高于第二個枕屉。而且召回率也很高

若有興趣常柄,歡迎來加入群,【Java初學者學習交流群】:458430385,此群有Java開發(fā)人員西潘、UI設計人員和前端工程師卷玉。有問必答,共同探討學習喷市,一起進步相种!
歡迎關注我的微信公眾號【Java碼農(nóng)社區(qū)】,會定時推送各種干貨:


qrcode_for_gh_577b64e73701_258.jpg
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末品姓,一起剝皮案震驚了整個濱河市寝并,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腹备,老刑警劉巖衬潦,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異植酥,居然都是意外死亡镀岛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門友驮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漂羊,“玉大人,你說我怎么就攤上這事喊儡〔τ耄” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵艾猜,是天一觀的道長买喧。 經(jīng)常有香客問我,道長匆赃,這世上最難降的妖魔是什么淤毛? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮算柳,結果婚禮上低淡,老公的妹妹穿的比我還像新娘。我一直安慰自己瞬项,他們只是感情好蔗蹋,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著囱淋,像睡著了一般猪杭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妥衣,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天皂吮,我揣著相機與錄音戒傻,去河邊找鬼。 笑死蜂筹,一個胖子當著我的面吹牛需纳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播艺挪,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼不翩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闺属?” 一聲冷哼從身側響起慌盯,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掂器,沒想到半個月后亚皂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡国瓮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年灭必,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乃摹。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡禁漓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孵睬,到底是詐尸還是另有隱情播歼,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布掰读,位于F島的核電站秘狞,受9級特大地震影響,放射性物質發(fā)生泄漏蹈集。R本人自食惡果不足惜烁试,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拢肆。 院中可真熱鬧减响,春花似錦、人聲如沸郭怪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鄙才。三九已至悼院,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咒循,已是汗流浹背据途。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叙甸,地道東北人颖医。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像裆蒸,于是被迫代替她去往敵國和親熔萧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容