ElasticSearch(八)Elasticsearch检索出

2019-05-07  本文已影响0人  minner_01

检索出的数据列表按字段匹配的优先顺序

一、举例

比如,发布一篇文章,文章包括基本的字段包括标题、发布时间、点击率、关键字、内容。当在页面中输入“教育”搜索关键词,会检索出指定字段包括“教育”的所有数据,举例:


81.png

有以上三条数据,如果按照默认的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

五、手册

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);
82.png
上一篇下一篇

猜你喜欢

热点阅读