1. 程式人生 > >15_ElasticSearch copy_to定製組合field進行cross-fields搜尋

15_ElasticSearch copy_to定製組合field進行cross-fields搜尋

15_ElasticSearch copy_to定製組合field進行cross-fields搜尋

更多幹貨

概述:

用most_fields策略,去實現cross-fields搜尋 問題:

  • 只是找到儘可能多的field匹配的doc,而不是某個field完全匹配的doc
  • most_fields,沒辦法用minimum_should_match去掉長尾資料,就是匹配的特別少的結果
  • TF/IDF演算法,比如Peter Smith和Smith Williams,搜尋Peter Smith的時候,由於first_name中很少有Smith的,所以query在所有document中的頻率很低,得到的分數很高,可能Smith Williams反而會排在Peter Smith前面

用copy_to 去實現cross-fields搜尋

  • 用copy_to,將多個field組合成一個field
  • 問題其實就出在有多個field,有多個field以後,就很尷尬,我們只要想辦法將一個標識跨在多個field的情況,合併成一個field即可。
  • 比如說,一個人名,本來是first_name,last_name,現在合併成一個full_name,不就ok了嗎。

例子

  • 增加 new_author_full_name 欄位
PUT/forum/_mapping/article
{
  "properties": {
      "new_author_first_name": {
          "type"
:"string", "copy_to":"new_author_full_name" }, "new_author_last_name": { "type":"string", "copy_to":"new_author_full_name" }, "new_author_full_name": { "type":"string" } } }

用了這個copy_to語法之後,就可以將多個欄位的值拷貝到一個欄位中,並建立倒排索引

POST /forum/article/
_bulk { "update": { "_id": "1"} } { "doc" : {"new_author_first_name" : "Peter", "new_author_last_name" : "Smith"} } --> Peter Smith { "update": { "_id": "2"} } { "doc" : {"new_author_first_name" : "Smith", "new_author_last_name" : "Williams"} } --> Smith Williams { "update": { "_id": "3"} } { "doc" : {"new_author_first_name" : "Jack", "new_author_last_name" : "Ma"} } --> Jack Ma { "update": { "_id": "4"} } { "doc" : {"new_author_first_name" : "Robbin", "new_author_last_name" : "Li"} } --> Robbin Li { "update": { "_id": "5"} } { "doc" : {"new_author_first_name" : "Tonny", "new_author_last_name" : "Peter Smith"} } --> Tonny Peter Smith

查詢:

GET/forum/article/_search
{
  "query": {
    "match": {
      "new_author_full_name":"Peter Smith"
    }
  }
}

解決了most_fields策略 存在的問題

  • 只是找到儘可能多的field匹配的doc,而不是某個field完全匹配的doc --> 解決,最匹配的document被最先返回
  • most_fields,沒辦法用minimum_should_match去掉長尾資料,就是匹配的特別少的結果 --> 解決,可以使用minimum_should_match去掉長尾資料
  • TF/IDF演算法,比如Peter Smith和Smith Williams,搜尋Peter Smith的時候,由於first_name中很少有Smith的,所以query在所有document中的頻率很低,得到的分數很高,可能Smith Williams反而會排在Peter Smith前面 --> 解決,Smith和Peter在一個field了,所以在所有document中出現的次數是均勻的,不會有極端的偏差

更多相關文章