美文网首页elasticsearch玩转大数据elasticsearch
二十八、Elasticsearch用function_score

二十八、Elasticsearch用function_score

作者: 编程界的小学生 | 来源:发表于2017-07-18 14:30 被阅读83次

    我们可以让score不走默认的,让他与我们某个field进行计算(加减乘除自己定义)得到一个结果作为score值

    数据准备
    follower_num:帖子阅读量

    POST /forum/article/_bulk
    { "update": { "_id": "1"} }
    { "doc" : {"follower_num" : 5} }
    { "update": { "_id": "2"} }
    { "doc" : {"follower_num" : 10} }
    { "update": { "_id": "3"} }
    { "doc" : {"follower_num" : 25} }
    { "update": { "_id": "4"} }
    { "doc" : {"follower_num" : 3} }
    { "update": { "_id": "5"} }
    { "doc" : {"follower_num" : 60} }
    

    将对帖子搜索得到的分数,跟follower_num进行运算,由follower_num在一定程度上增强帖子的分数
    看帖子的人越多,那么帖子的分数就越高

    GET /forum/article/_search
    {
      "query": {
        "function_score": {
          "query": {
            "multi_match": {
              "query": "java spark",
              "fields": ["title", "content"]
            }
          },
          "field_value_factor": {
            "field": "follower_num"
          }
        }
      }
    }
    

    结果:

    {
      "took": 124,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 4,
        "max_score": 40.994698,
        "hits": [
          {
            "_index": "forum",
            "_type": "article",
            "_id": "5",
            "_score": 40.994698,
            "_source": {
              "articleID": "DHJK-B-1395-#Ky5",
              "userID": 3,
              "hidden": false,
              "postDate": "2017-03-01",
              "tag": [
                "elasticsearch"
              ],
              "tag_cnt": 1,
              "view_cnt": 10,
              "title": "this is spark blog",
              "content": "spark is best big data solution based on scala ,an programming language similar to java spark",
              "sub_title": "haha, hello world",
              "author_first_name": "Tonny",
              "author_last_name": "Peter Smith",
              "new_author_last_name": "Peter Smith",
              "new_author_first_name": "Tonny",
              "follower_num": 60
            }
          },
          {
            "_index": "forum",
            "_type": "article",
            "_id": "2",
            "_score": 6.8640785,
            "_source": {
              "articleID": "KDKE-B-9947-#kL5",
              "userID": 1,
              "hidden": false,
              "postDate": "2017-01-02",
              "tag": [
                "java"
              ],
              "tag_cnt": 1,
              "view_cnt": 50,
              "title": "this is java blog",
              "content": "i think java is the best programming language",
              "sub_title": "learned a lot of course",
              "author_first_name": "Smith",
              "author_last_name": "Williams",
              "new_author_last_name": "Williams",
              "new_author_first_name": "Smith",
              "follower_num": 10
            }
          },
          {
            "_index": "forum",
            "_type": "article",
            "_id": "1",
            "_score": 1.3371139,
            "_source": {
              "articleID": "XHDK-A-1293-#fJ3",
              "userID": 1,
              "hidden": false,
              "postDate": "2017-01-01",
              "tag": [
                "java",
                "hadoop"
              ],
              "tag_cnt": 2,
              "view_cnt": 30,
              "title": "this is java and elasticsearch blog",
              "content": "i like to write best elasticsearch article",
              "sub_title": "learning more courses",
              "author_first_name": "Peter",
              "author_last_name": "Smith",
              "new_author_last_name": "Smith",
              "new_author_first_name": "Peter",
              "follower_num": 5
            }
          },
          {
            "_index": "forum",
            "_type": "article",
            "_id": "4",
            "_score": 0.46640402,
            "_source": {
              "articleID": "QQPX-R-3956-#aD8",
              "userID": 2,
              "hidden": true,
              "postDate": "2017-01-02",
              "tag": [
                "java",
                "elasticsearch"
              ],
              "tag_cnt": 2,
              "view_cnt": 80,
              "title": "this is java, elasticsearch, hadoop blog",
              "content": "elasticsearch and hadoop are all very good solution, i am a beginner",
              "sub_title": "both of them are good",
              "author_first_name": "Robbin",
              "author_last_name": "Li",
              "new_author_last_name": "Li",
              "new_author_first_name": "Robbin",
              "follower_num": 3
            }
          }
        ]
      }
    }
    

    可以发现分数都特别的大,都在好几十。是因为它与我们的follower_num进行了乘法运算。

    我们想让分数不要相差的这么离谱怎么办? modifier

    GET /forum/article/_search
    {
      "query": {
        "function_score": {
          "query": {
            "multi_match": {
              "query": "java spark",
              "fields": ["title", "content"]
            }
          },
          "field_value_factor": {
            "field": "follower_num",
            "modifier": "log1p"
          }
        }
      }
    }
    

    结果

    {
      "took": 5,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 4,
        "max_score": 1.0189654,
        "hits": [
          {
            "_index": "forum",
            "_type": "article",
            "_id": "5",
            "_score": 1.0189654,
            "_source": {
              "articleID": "DHJK-B-1395-#Ky5",
              "userID": 3,
              "hidden": false,
              "postDate": "2017-03-01",
              "tag": [
                "elasticsearch"
              ],
              "tag_cnt": 1,
              "view_cnt": 10,
              "title": "this is spark blog",
              "content": "spark is best big data solution based on scala ,an programming language similar to java spark",
              "sub_title": "haha, hello world",
              "author_first_name": "Tonny",
              "author_last_name": "Peter Smith",
              "new_author_last_name": "Peter Smith",
              "new_author_first_name": "Tonny",
              "follower_num": 60
            }
          },
          {
            "_index": "forum",
            "_type": "article",
            "_id": "2",
            "_score": 0.53412914,
            "_source": {
              "articleID": "KDKE-B-9947-#kL5",
              "userID": 1,
              "hidden": false,
              "postDate": "2017-01-02",
              "tag": [
                "java"
              ],
              "tag_cnt": 1,
              "view_cnt": 50,
              "title": "this is java blog",
              "content": "i think java is the best programming language",
              "sub_title": "learned a lot of course",
              "author_first_name": "Smith",
              "author_last_name": "Williams",
              "new_author_last_name": "Williams",
              "new_author_first_name": "Smith",
              "follower_num": 10
            }
          },
          {
            "_index": "forum",
            "_type": "article",
            "_id": "1",
            "_score": 0.14549617,
            "_source": {
              "articleID": "XHDK-A-1293-#fJ3",
              "userID": 1,
              "hidden": false,
              "postDate": "2017-01-01",
              "tag": [
                "java",
                "hadoop"
              ],
              "tag_cnt": 2,
              "view_cnt": 30,
              "title": "this is java and elasticsearch blog",
              "content": "i like to write best elasticsearch article",
              "sub_title": "learning more courses",
              "author_first_name": "Peter",
              "author_last_name": "Smith",
              "new_author_last_name": "Smith",
              "new_author_first_name": "Peter",
              "follower_num": 5
            }
          },
          {
            "_index": "forum",
            "_type": "article",
            "_id": "4",
            "_score": 0.06186694,
            "_source": {
              "articleID": "QQPX-R-3956-#aD8",
              "userID": 2,
              "hidden": true,
              "postDate": "2017-01-02",
              "tag": [
                "java",
                "elasticsearch"
              ],
              "tag_cnt": 2,
              "view_cnt": 80,
              "title": "this is java, elasticsearch, hadoop blog",
              "content": "elasticsearch and hadoop are all very good solution, i am a beginner",
              "sub_title": "both of them are good",
              "author_first_name": "Robbin",
              "author_last_name": "Li",
              "new_author_last_name": "Li",
              "new_author_first_name": "Robbin",
              "follower_num": 3
            }
          }
        ]
      }
    }
    

    公式会变为,new_score = old_score * log(1 + number_of_votes),这样出来的分数会比较合理

    再加个factor,可以进一步影响分数,new_score = old_score * log(1 + factor * number_of_votes)

    GET /forum/article/_search
    {
      "query": {
        "function_score": {
          "query": {
            "multi_match": {
              "query": "java spark",
              "fields": ["title", "content"]
            }
          },
          "field_value_factor": {
            "field": "follower_num",
            "modifier": "log1p",
            "factor": 0.5
          }
        }
      }
    }
    

    结果

    {
      "took": 10,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 4,
        "max_score": 1.0189654,
        "hits": [
          {
            "_index": "forum",
            "_type": "article",
            "_id": "5",
            "_score": 1.0189654,
            "_source": {
              "articleID": "DHJK-B-1395-#Ky5",
              "userID": 3,
              "hidden": false,
              "postDate": "2017-03-01",
              "tag": [
                "elasticsearch"
              ],
              "tag_cnt": 1,
              "view_cnt": 10,
              "title": "this is spark blog",
              "content": "spark is best big data solution based on scala ,an programming language similar to java spark",
              "sub_title": "haha, hello world",
              "author_first_name": "Tonny",
              "author_last_name": "Peter Smith",
              "new_author_last_name": "Peter Smith",
              "new_author_first_name": "Tonny",
              "follower_num": 60
            }
          },
          {
            "_index": "forum",
            "_type": "article",
            "_id": "2",
            "_score": 0.53412914,
            "_source": {
              "articleID": "KDKE-B-9947-#kL5",
              "userID": 1,
              "hidden": false,
              "postDate": "2017-01-02",
              "tag": [
                "java"
              ],
              "tag_cnt": 1,
              "view_cnt": 50,
              "title": "this is java blog",
              "content": "i think java is the best programming language",
              "sub_title": "learned a lot of course",
              "author_first_name": "Smith",
              "author_last_name": "Williams",
              "new_author_last_name": "Williams",
              "new_author_first_name": "Smith",
              "follower_num": 10
            }
          },
          {
            "_index": "forum",
            "_type": "article",
            "_id": "1",
            "_score": 0.14549617,
            "_source": {
              "articleID": "XHDK-A-1293-#fJ3",
              "userID": 1,
              "hidden": false,
              "postDate": "2017-01-01",
              "tag": [
                "java",
                "hadoop"
              ],
              "tag_cnt": 2,
              "view_cnt": 30,
              "title": "this is java and elasticsearch blog",
              "content": "i like to write best elasticsearch article",
              "sub_title": "learning more courses",
              "author_first_name": "Peter",
              "author_last_name": "Smith",
              "new_author_last_name": "Smith",
              "new_author_first_name": "Peter",
              "follower_num": 5
            }
          },
          {
            "_index": "forum",
            "_type": "article",
            "_id": "4",
            "_score": 0.06186694,
            "_source": {
              "articleID": "QQPX-R-3956-#aD8",
              "userID": 2,
              "hidden": true,
              "postDate": "2017-01-02",
              "tag": [
                "java",
                "elasticsearch"
              ],
              "tag_cnt": 2,
              "view_cnt": 80,
              "title": "this is java, elasticsearch, hadoop blog",
              "content": "elasticsearch and hadoop are all very good solution, i am a beginner",
              "sub_title": "both of them are good",
              "author_first_name": "Robbin",
              "author_last_name": "Li",
              "new_author_last_name": "Li",
              "new_author_first_name": "Robbin",
              "follower_num": 3
            }
          }
        ]
      }
    }
    

    我们不想乘法,想加上follower_num

    GET /forum/article/_search
    {
      "query": {
        "function_score": {
          "query": {
            "multi_match": {
              "query": "java spark",
              "fields": ["title", "content"]
            }
          },
          "field_value_factor": {
            "field": "follower_num",
            "modifier": "log1p",
            "factor": 0.5
          },
          "boost_mode": "sum"
        }
      }
    }
    

    结果

    {
      "took": 3,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 4,
        "max_score": 2.1746066,
        "hits": [
          {
            "_index": "forum",
            "_type": "article",
            "_id": "5",
            "_score": 2.1746066,
            "_source": {
              "articleID": "DHJK-B-1395-#Ky5",
              "userID": 3,
              "hidden": false,
              "postDate": "2017-03-01",
              "tag": [
                "elasticsearch"
              ],
              "tag_cnt": 1,
              "view_cnt": 10,
              "title": "this is spark blog",
              "content": "spark is best big data solution based on scala ,an programming language similar to java spark",
              "sub_title": "haha, hello world",
              "author_first_name": "Tonny",
              "author_last_name": "Peter Smith",
              "new_author_last_name": "Peter Smith",
              "new_author_first_name": "Tonny",
              "follower_num": 60
            }
          },
          {
            "_index": "forum",
            "_type": "article",
            "_id": "2",
            "_score": 1.4645591,
            "_source": {
              "articleID": "KDKE-B-9947-#kL5",
              "userID": 1,
              "hidden": false,
              "postDate": "2017-01-02",
              "tag": [
                "java"
              ],
              "tag_cnt": 1,
              "view_cnt": 50,
              "title": "this is java blog",
              "content": "i think java is the best programming language",
              "sub_title": "learned a lot of course",
              "author_first_name": "Smith",
              "author_last_name": "Williams",
              "new_author_last_name": "Williams",
              "new_author_first_name": "Smith",
              "follower_num": 10
            }
          },
          {
            "_index": "forum",
            "_type": "article",
            "_id": "1",
            "_score": 0.81149083,
            "_source": {
              "articleID": "XHDK-A-1293-#fJ3",
              "userID": 1,
              "hidden": false,
              "postDate": "2017-01-01",
              "tag": [
                "java",
                "hadoop"
              ],
              "tag_cnt": 2,
              "view_cnt": 30,
              "title": "this is java and elasticsearch blog",
              "content": "i like to write best elasticsearch article",
              "sub_title": "learning more courses",
              "author_first_name": "Peter",
              "author_last_name": "Smith",
              "new_author_last_name": "Smith",
              "new_author_first_name": "Peter",
              "follower_num": 5
            }
          },
          {
            "_index": "forum",
            "_type": "article",
            "_id": "4",
            "_score": 0.553408,
            "_source": {
              "articleID": "QQPX-R-3956-#aD8",
              "userID": 2,
              "hidden": true,
              "postDate": "2017-01-02",
              "tag": [
                "java",
                "elasticsearch"
              ],
              "tag_cnt": 2,
              "view_cnt": 80,
              "title": "this is java, elasticsearch, hadoop blog",
              "content": "elasticsearch and hadoop are all very good solution, i am a beginner",
              "sub_title": "both of them are good",
              "author_first_name": "Robbin",
              "author_last_name": "Li",
              "new_author_last_name": "Li",
              "new_author_first_name": "Robbin",
              "follower_num": 3
            }
          }
        ]
      }
    }
    

    boost_mode,可以决定分数与指定字段的值如何计算,multiply,sum,min,max,replace

    max_boost,限制计算出来的分数不要超过max_boost指定的值

    GET /forum/article/_search
    {
      "query": {
        "function_score": {
          "query": {
            "multi_match": {
              "query": "java spark",
              "fields": ["title", "content"]
            }
          },
          "field_value_factor": {
            "field": "follower_num",
            "modifier": "log1p",
            "factor": 0.5
          },
          "boost_mode": "sum",
          "max_boost": 2
        }
      }
    }
    

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


    qrcode_for_gh_577b64e73701_258.jpg

    相关文章

      网友评论

        本文标题:二十八、Elasticsearch用function_score

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