1. 程式人生 > >16.copy_to定制組合field解決cross-fields搜索弊端

16.copy_to定制組合field解決cross-fields搜索弊端

使用 弊端 字段 min map mono 次數 gpo 叠代

主要知識點:

  1. 在index的mapping中加copy_to字段的方法
  2. copy_to搜索方法

most_fields策略,去實現cross-fields搜索,有3大弊端,為了解決這三個弊端,es的第一個辦法就是用copy_to將多個field組合成一個field

most_fields策略問題就出在有多個field,es只要將一個標識跨在多個field的情況,合並成一個field即可。比如說,一個人名,本來是first_namelast_name,現在合並成一個full_name,這樣就能有效的解決問題。

一、在indexmapping中加copy_to字段的方法

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"} }

{ "update": { "_id": "2"} }

{ "doc" : {"new_author_first_name" : "Smith", "new_author_last_name" : "Williams"} }

{ "update": { "_id": "3"} }

{ "doc" : {"new_author_first_name" : "Jack", "new_author_last_name" : "Ma"} }

{ "update": { "_id": "4"} }

{ "doc" : {"new_author_first_name" : "Robbin", "new_author_last_name" : "Li"} }

{ "update": { "_id": "5"} }

{ "doc" : {"new_author_first_name" : "Tonny", "new_author_last_name" : "Peter Smith"} }

註意:用 get /forum/article/_serarch 這種方法是不能查出new_author_full_name這個字段的,因為copy_to的字段類型於_all的字段。

三、進行搜索

GET /forum/article/_search

{

"query": {

"match": {

"new_author_full_name": "Peter Smith"

}

}

}

這樣,我們搜索時就搜索的是new_author_full_name這一個字段,所以就不會出現那三個弊端。

  弊端1:只是找到盡可能多的field匹配的doc,而不是某個field完全匹配的doc --> 解決,最匹配的document被最先返回

  弊端2most_fields,沒辦法用minimum_should_match去掉長尾數據,就是匹配的特別少的結果 --> 解決,可以使用minimum_should_match去掉長尾數據

  弊端3TF/IDF算法,比如Peter SmithSmith Williams,搜索Peter Smith的時候,由於first_name中很少有Smith的,所以query在所有document中的頻率很低,得到的分數很高,可能Smith Williams反而會排在Peter Smith前面 --> 解決,SmithPeter在一個field了,所以在所有document中出現的次數是均勻的,不會有極端的偏差

四、其他說明:

  這幾節課學的知識,在很多時候很難復現。比如官網也會給一些例子,說用什麽什麽文本,怎麽怎麽搜索,是怎麽怎麽樣的效果,但上實際情況去es中執行的時候並沒有復現。這是因為es版本在不斷叠代,打分算法也在不斷的叠代。所以對類似這幾講講解的best_fieldsmost_fieldscross_fields,完全復現出來應有的場景和效果是很難的。更多是掌握有原理和知識點,以及做法,

16.copy_to定制組合field解決cross-fields搜索弊端