15_ElasticSearch copy_to定製組合field進行cross-fields搜尋
阿新 • • 發佈:2019-01-07
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中出現的次數是均勻的,不會有極端的偏差