ElasticSearch(十)Elasticsearch檢索出的數據列表按字段匹配的優先順序及搜索單詞拼音一部分搜不到數據


檢索出的數據列表按字段匹配的優先順序

一、舉例

比如,發布一篇文章,文章包括基本的字段包括標題、發布時間、點擊率、關鍵字、內容。當在頁面中輸入“教育”搜索關鍵詞,會檢索出指定字段包括“教育”的所有數據,舉例:

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

五、手冊

Elasticsearch權威指南(中文版)

 

解決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);

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM