16.copy_to定制組合field解決cross-fields搜索弊端
主要知識點:
- 在index的mapping中加copy_to字段的方法
- copy_to搜索方法
用most_fields策略,去實現cross-fields搜索,有3大弊端,為了解決這三個弊端,es的第一個辦法就是用copy_to將多個field組合成一個field。
most_fields策略問題就出在有多個field,es只要將一個標識跨在多個field的情況,合並成一個field即可。比如說,一個人名,本來是first_name,last_name,現在合並成一個full_name,這樣就能有效的解決問題。
一、在index的mapping中加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被最先返回
弊端2:most_fields,沒辦法用minimum_should_match去掉長尾數據,就是匹配的特別少的結果 --> 解決,可以使用minimum_should_match去掉長尾數據
弊端3:TF/IDF算法,比如Peter Smith和Smith Williams,搜索Peter Smith的時候,由於first_name中很少有Smith的,所以query在所有document中的頻率很低,得到的分數很高,可能Smith Williams反而會排在Peter Smith前面 --> 解決,Smith和Peter在一個field了,所以在所有document中出現的次數是均勻的,不會有極端的偏差
四、其他說明:
這幾節課學的知識,在很多時候很難復現。比如官網也會給一些例子,說用什麽什麽文本,怎麽怎麽搜索,是怎麽怎麽樣的效果,但上實際情況去es中執行的時候並沒有復現。這是因為es版本在不斷叠代,打分算法也在不斷的叠代。所以對類似這幾講講解的best_fields,most_fields,cross_fields,完全復現出來應有的場景和效果是很難的。更多是掌握有原理和知識點,以及做法,
16.copy_to定制組合field解決cross-fields搜索弊端