檢索出的資料列表按欄位匹配的優先順序
一、舉例
比如,釋出一篇文章,文章包括基本的欄位包括標題、釋出時間、點選率、關鍵字、內容。當在頁面中輸入“教育”搜尋關鍵詞,會檢索出指定欄位包括“教育”的所有資料,舉例:
id title keyword content
1 納稅 繼續教育,贍養父母,房屋貸款 教育,子女
2 上學 義務教育 好好學習天天向上
3 畢業 好好工作好好學習 結束教育教育
有以上三條資料,如果按照預設的ES檢索機制,會按照最多匹配的優先順序,比如,id為1的keyword和content欄位都包括教育關鍵字,id為1的會排在最前面,同時id為2和3的,id3更有匹配度,包括兩個教育關鍵字,可能ES給檢出的資料排序為1、3、2(這裡只是猜測,懶得動手了)
二、需求
在公司需求中有這麼一個要求,首先,檢索資料會先檢索出關鍵字(keyword)的資料,點選載入更多按鈕,再檢索關鍵字(keyword)和內容(content)同時包括的資料,並且匹配關鍵字的優先展示在前面。
如果不瞭解ES強大的童鞋可能會在檢索出所有資料的時候然後再把資料處理一遍。BUT,ES的排序機制是很強大的,我在根據公司產品需求搜了各種相關的帖子,一邊瞭解一邊實踐,最終走通了產品需求想要的效果。
三、程式碼
//總之TMD稀裡糊塗實現了需求,不知道具體為什麼,有空深入一下ES吧~
$MultiMatch_obj = new \Elastica\Query\MultiMatch();
$MultiMatch_obj->setQuery($keyword);
if ($search_type == 'default') { //這裡是首先預設載入匹配關鍵字的列表
$MultiMatch_obj->setFields(array('keywords'));
} else { //點選載入更多匹配出包括關鍵字和內容的列表
$MultiMatch_obj->setTieBreaker(0.3); //設定Breaker
$MultiMatch_obj->setType('best_fields'); //開啟best_fields
$MultiMatch_obj->setFields(array('keywords^901209','content')); //要優先的keywords 加一個^,後面還跟一個數字(數字隨便寫的,我覺得比content大就可以了,content應該也是可以跟^數字的
$MultiMatch_obj->setOperator('or');
$MultiMatch_obj->setMinimumShouldMatch('30%'); //這裡還需要設定
}
$query->setQuery($MultiMatch_obj); //命中全部紀錄
四、參考
https://www.cnblogs.com/bonelee/p/6827068.html
https://www.cnblogs.com/clonen/p/6674922.html
https://www.cnblogs.com/yjf512/p/4897294.html
五、手冊
解決ES搜尋拼音字母的一部分搜不到資料
問題通:https://elasticsearch.cn/question/5418
$Wildcard_query1 = new \Elastica\Query\Wildcard('keywords',"*". $keyword."*");
$Wildcard_query2 = new \Elastica\Query\Wildcard('title',"*". $keyword."*");
$Wildcard_query3 = new \Elastica\Query\Wildcard('content',"*". $keyword."*");
$query->addShould($Wildcard_query1)->addShould($Wildcard_query2)->addShould($Wildcard_query3);