zoukankan      html  css  js  c++  java
  • 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 ElasticaQuery();
    $MultiMatch_obj = new ElasticaQueryMultiMatch();
    $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 ElasticaQueryWildcard('keywords',"*". $keyword."*");
                $Wildcard_query2 = new ElasticaQueryWildcard('title',"*". $keyword."*");
                $Wildcard_query3 = new ElasticaQueryWildcard('content',"*". $keyword."*");
                $query->addShould($Wildcard_query1)->addShould($Wildcard_query2)->addShould($Wildcard_query3);

     

  • 相关阅读:
    POJ-2955 Brackets(括号匹配问题)
    NYOJ
    石子合并问题
    hdu 4915 括号匹配+巧模拟
    hdu 4920
    hdu 4911 求逆序对数+树状数组
    hdu 4923 单调栈
    hdu 4930 斗地主恶心模拟
    hdu 4927 组合+公式
    hdu 4925 黑白格
  • 原文地址:https://www.cnblogs.com/wt645631686/p/9960099.html
Copyright © 2011-2022 走看看