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

 

 

 

 

posted @ 2019-01-11 20:11  温柔的风  阅读(6417)  评论(0编辑  收藏  举报