美文网首页elasticsearch玩转大数据大数据 爬虫Python AI Sql
十六、Elasticsearch使用copy_to定制组合fie

十六、Elasticsearch使用copy_to定制组合fie

作者: 编程界的小学生 | 来源:发表于2017-07-16 15:08 被阅读48次

    1、使用copy_to将多个field组合成一个field解决上一讲cross-fields的三个问题

    主要问题出现在跨了多个字段去搜索,我们只要想办法将一个标识跨在多个field的情况合并成一个field即可,比如说本来是first_name和last_name,现在合并成一个full_name不就ok了吗

    2、实战

    PUT /forum/_mapping/article
    {
      "properties": {
        "new_author_first_name" : {
          "type": "string",
          "copy_to": "new_author_full_name"
        },
        "new_author_last_name" : {
          "type": "string",
          "copy_to": "new_author_full_name"
        },
        "new_author_full_name" : {
          "type": "string"
        }
      }
    }
    

    用了这个copy_to语法之后,就可以将掉个字段的值拷贝到一个新的字段中,并建立倒排索引。
    这里是将new_author_first_name和new_author_last_name的值拼接成一个字符串到new_author_full_name上

    准备数据

    POST /forum/article/_bulk
    { "update": { "_id": "1"} }
    { "doc" : {"new_author_first_name" : "Peter", "new_author_last_name" : "Smith"} }       --> Peter Smith
    { "update": { "_id": "2"} } 
    { "doc" : {"new_author_first_name" : "Smith", "new_author_last_name" : "Williams"} }        --> Smith Williams
    { "update": { "_id": "3"} }
    { "doc" : {"new_author_first_name" : "Jack", "new_author_last_name" : "Ma"} }           --> Jack Ma
    { "update": { "_id": "4"} }
    { "doc" : {"new_author_first_name" : "Robbin", "new_author_last_name" : "Li"} }         --> Robbin Li
    { "update": { "_id": "5"} }
    { "doc" : {"new_author_first_name" : "Tonny", "new_author_last_name" : "Peter Smith"} }     --> Tonny Peter Smith
    

    再次搜索

    GET /forum/article/_search
    {
      "query": {
        "match": {
          "new_author_full_name": "Peter Smith"
        }
      }
    }
    

    这时候只搜索一个字段,当然既不会出现cross_fields的问题,又可以得到想要的结果。

    3、上篇幅答疑
    问题1:只是找到尽可能多的field匹配doc,而不是某个field完全匹配的doc
    解决方案:最匹配的document被最先返回

    问题2:most_fields,没办法用minimum_should_match去掉长尾数据,就是匹配的特别少的结果
    解决方案:可以使用minimum_should_match去掉长尾数据(上篇幅不能去掉这篇幅能去掉是因为这篇幅将多个字段copy_to合并成一个了,所以不存在cross-fields)

    问题3:TF/IDF算法,比如Peter Smith和Smith Williams,搜索Peter Smith的时候,由于first_name中很少有Smith的,所以query在所有document中的频率很低,得到的分数很高,可能Smith Williams反而会排在Peter Smith前面
    解决方案:Smith和Peter在一个field了,所以在所有document中出现的次数是均匀的,不会有极端的偏差

    若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
    欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:


    qrcode_for_gh_577b64e73701_258.jpg

    相关文章

      网友评论

        本文标题:十六、Elasticsearch使用copy_to定制组合fie

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