檢索出的數據列表按字段匹配的優先順序
一、舉例
比如,發布一篇文章,文章包括基本的字段包括標題、發布時間、點擊率、關鍵字、內容。當在頁面中輸入“教育”搜索關鍵詞,會檢索出指定字段包括“教育”的所有數據,舉例:
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的排序機制是很強大的,我在根據公司產品需求搜了各種相關的帖子,一邊了解一邊實踐,最終走通了產品需求想要的效果。
三、代碼
$query = new \Elastica\Query(); $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);