美文网首页
ElasticSearch(八)Elasticsearch检索出

ElasticSearch(八)Elasticsearch检索出

作者: minner_01 | 来源:发表于2019-05-07 16:35 被阅读0次

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

    一、举例

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


    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

    相关文章

      网友评论

          本文标题:ElasticSearch(八)Elasticsearch检索出

          本文链接:https://www.haomeiwen.com/subject/epcyoqtx.html