关于ES中Function_Score在自定义打分中的应用

这篇具有很好参考价值的文章主要介绍了关于ES中Function_Score在自定义打分中的应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

应用背景

现在有许多商品需要在商品列表中进行排序展示,排序要求使用ES并且尽量一次性查出来,有要求如下:
  • 重点商品,收藏商品,优质商品,普通商品的顺序展出
  • 在同一类商品发生冲突时,按照自主产品,非自主产品进行展出(是否自主产品是一个集合,只有集合里面有7才属于自主产品,没有7则属于非自主产品)
  • 如果继续发生冲突 按照商品录入时间展出
  • 最后用id来进行兜底
  • 优质商品首先根据商品的等级来排序,然后才走第二行

ES中使用到的字。

id (商品的序列号),
create_time(创建商品时间) ,
one_hand_commodity(是否是优质商品) ,
commodity_level , (商品等级4个级别 S,A,B,C)
commodity_list(商品属性,是否是自主产品) ,
publish_time , (商品上架时间)

难点

在这次应用中,有几个难点
1、优质商品有着自己的排序特点,不能使用sort来进行总体排序。
2、重点商品以及收藏商品需要置顶放在最高。
3、就是在原有实现方案基础上进行代码的合并

分析

在不能使用sort的情况下,以及优质商品的独特性,我们在ES官网给出了我们提示,使用得分,自定义得分以及funcationScore来实现评分排序。
由于优质商品有着独特的排序情况,我们将 one_hand_commodity(是否是优质商品)与commodity_level , (商品等级4个级别 S,A,B,C)俩字段,将他们满足优质商品同时满足商品等级的氛围不同的权重,用weight来赋值。

"function_score": {
            "query": {
              "term": {
                "one_hand_commodity: {
                  "value": "1",
                  "boost": 1
                }
              }
            },
            "functions": [
              {
                "filter": {
                  "term": {
                    "commodity_level": {
                      "value": 1,
                      "boost": 1
                    }
                  }
                },
                "weight": 96
              },
              {
                "filter": {
                  "term": {
                    "commodity_level": {
                      "value": 2,
                      "boost": 1
                    }
                  }
                },
                "weight": 48
              },
              {
                "filter": {
                  "term": {
                    "commodity_level": {
                      "value": 3,
                      "boost": 1
                    }
                  }
                },
                "weight": 24
              },
              {
                "filter": {
                  "term": {
                    "commodity_level": {
                      "value": 4,
                      "boost": 1
                    }
                  }
                },
                "weight": 12
              }
            ],
            "score_mode": "sum",
            "boost_mode": "replace",
          }

其中的score_mode 的作用是在functions所有命中的filter,都采用sum即累加的方式,而boost_mode 是整个functionScore与外面的query采用replace,替换的方式进行积分。
像 在集合中是否存在7,可以使用terms来进行命中

 "function_score": {
            "query": {
              "bool": {
                "must_not": [
                  {
                    "term": {
                      "commodity_list": {
                        "value": "7",
                        "boost": 1
                      }
                    }
                  }
                ],
                "adjust_pure_negative": true,
                "boost": 1
              }
            },
            "functions": [
              {
                "filter": {
                  "bool": {
                    "must_not": [
                      {
                        "term": {
                          "commodity_list": {
                            "value": "7",
                            "boost": 1
                          }
                        }
                      }
                    ],
                    "adjust_pure_negative": true,
                    "boost": 1
                  }
                },
                "weight": 3
              }
            ],
            "score_mode": "sum",
            "boost_mode": "replace",
            "boost": 1
          }

而对于重点商品以及收藏商品就可以在mysql中关联查询出来,在es语句中进行赋值

"function_score": {
            "query": {
              "terms": {
                "id": [
                  53507,
                  53628
                ],
                "boost": 1
              }
            },
            "functions": [
              {
                "filter": {
                  "terms": {
                    "id": [
                      53507,
                      53628
                    ],
                    "boost": 1
                  }
                },
                "weight": 192
              }
            ],
            "score_mode": "sum",
            "boost_mode": "replace",
            "boost": 1
          }

这样将优质商品的不同等级进行了不同的得分,最后就可以使用sort来进行排序。

  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    },
    {
      "create_time": {
        "order": "desc"
      }
    },
    {
      "id": {
        "order": "desc"
      }
    }
  ],

ps:整个这次查询的weight设置,统一使用

前面所有weight和 < 现在需要赋值的weight
且最小只能从大于1开始,不能为1。

附:全部查询代码文章来源地址https://www.toymoban.com/news/detail-498510.html

{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "commodity_status": {
              "value": 2,
              "boost": 1
            }
          }
        },
        {
          "terms": {
            "id": [
              53507,
              53628,
              53656,
              53681
            ],
            "boost": 1
          }
        },
        {
          "term": {
            "is_delete": {
              "value": 0,
              "boost": 1
            }
          }
        }
      ],
      "should": [
        {
          "function_score": {
            "query": {
              "term": {
                "one_hand_commodity": {
                  "value": "1",
                  "boost": 1
                }
              }
            },
            "functions": [
              {
                "filter": {
                  "term": {
                    "commodity_level": {
                      "value": 1,
                      "boost": 1
                    }
                  }
                },
                "weight": 96
              },
              {
                "filter": {
                  "term": {
                    "commodity_level": {
                      "value": 2,
                      "boost": 1
                    }
                  }
                },
                "weight": 48
              },
              {
                "filter": {
                  "term": {
                    "commodity_level": {
                      "value": 3,
                      "boost": 1
                    }
                  }
                },
                "weight": 24
              },
              {
                "filter": {
                  "term": {
                    "commodity_level": {
                      "value": 4,
                      "boost": 1
                    }
                  }
                },
                "weight": 12
              }
            ],
            "score_mode": "sum",
            "boost_mode": "replace",
            "max_boost": 3.4028235e+38,
            "boost": 1
          }
        },
        {
          "function_score": {
            "query": {
              "term": {
                "one_hand_commodity": {
                  "value": "0",
                  "boost": 1
                }
              }
            },
            "functions": [
              {
                "filter": {
                  "term": {
                    "one_hand_commodity": {
                      "value": "0",
                      "boost": 1
                    }
                  }
                },
                "weight": 6
              }
            ],
            "score_mode": "sum",
            "boost_mode": "replace",
            "max_boost": 3.4028235e+38,
            "boost": 1
          }
        },
        {
          "function_score": {
            "query": {
              "term": {
                "commodity_list": {
                  "value": "7",
                  "boost": 1
                }
              }
            },
            "functions": [
              {
                "filter": {
                  "term": {
                    "commodity_list": {
                      "value": "7",
                      "boost": 1
                    }
                  }
                },
                "weight": 2
              }
            ],
            "score_mode": "sum",
            "boost_mode": "replace",
            "max_boost": 3.4028235e+38,
            "boost": 1
          }
        },
        {
          "function_score": {
            "query": {
              "bool": {
                "must_not": [
                  {
                    "term": {
                      "commodity_list": {
                        "value": "7",
                        "boost": 1
                      }
                    }
                  }
                ],
                "adjust_pure_negative": true,
                "boost": 1
              }
            },
            "functions": [
              {
                "filter": {
                  "bool": {
                    "must_not": [
                      {
                        "term": {
                          "commodity_list": {
                            "value": "7",
                            "boost": 1
                          }
                        }
                      }
                    ],
                    "adjust_pure_negative": true,
                    "boost": 1
                  }
                },
                "weight": 3
              }
            ],
            "score_mode": "sum",
            "boost_mode": "replace",
            "max_boost": 3.4028235e+38,
            "boost": 1
          }
        },
        {
          "function_score": {
            "query": {
              "terms": {
                "id": [
                  53507,
                  53628,
                  53656,
                  53681
                ],
                "boost": 1
              }
            },
            "functions": [
              {
                "filter": {
                  "terms": {
                    "id": [
                      53507,
                      53628,
                      53656,
                      53681
                    ],
                    "boost": 1
                  }
                },
                "weight": 192
              }
            ],
            "score_mode": "sum",
            "boost_mode": "max",
            "max_boost": 3.4028235e+38,
            "boost": 1
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    },
    {
      "create_time": {
        "order": "desc"
      }
    },
    {
      "id": {
        "order": "desc"
      }
    }
  ],
  "track_total_hits": 2147483647
}

到了这里,关于关于ES中Function_Score在自定义打分中的应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES 向量搜索 function score 报错

    reason \\\"function score query returned an invalid score: NaN for doc: 17085 原因是向量搜索定义评分的计算方法consineSimilarity的计算过程中需要对两个向量求模 故,如果全文索引中存在全零向量数据时,可以将consineSimilarity计算换成其它向量相似度计算方法,例如 dotProduct consineSimilarity替换为

    2024年02月15日
    浏览(41)
  • ElasticSearch之score打分机制原理

    Elasticsearch 的得分机制是一个基于词频和逆文档词频的公式,简称为 TF-IDF 公式,所以先来研究下 TF-IDF 原理。 TF-IDF 的英文全称是: Term Frequency - Inverse Document Frequency ,中文名称词频-逆文档频率。 常用于文本挖掘,资讯检索等应用,在 NLP 以及推荐等领域都是一个常用的指标

    2023年04月25日
    浏览(77)
  • Elasticsearch(十三)搜索---搜索匹配功能④--Constant Score查询、Function Score查询

    之前我们学习了布尔查询,知道了filter查询只在乎查询条件和文档的匹配程度,但不会根据匹配程度对文档进行打分,而对于must、should这两个布尔查询会对文档进行打分,那如果我想在查询的时候同时不去在乎文档的打分(对搜索结果的排序),只想过滤文本字段是否包含这

    2024年02月11日
    浏览(43)
  • Elasticsearch 查询之Function Score Query

    前言 ES 的主查询评分模式分为两种,是信息检索领域的重要算法: TF-IDF 算法 和 BM25 算法。 Elasticsearch 从版本 5.0 开始引入了 BM25 算法作为默认的文档评分(relevance scoring)算法。在此之前,Elasticsearch 使用的是 TF-IDF 算法作为默认的文档评分算法。从版本 5.0 起,BM25 算法取代

    2024年02月12日
    浏览(41)
  • ES系列--打分机制

    当你通过搜索相关文档时,可能会出现多个文档,这些文档的顺序是通过一个max_score属性的大小从高到低顺序展现出来的,max_score属性就是我们所说的评分。而这个评分是通过一个文档打分机制计算出来的。 一、总公式 max_score = boost  *  idf  *  tf  其中,查询权重可

    2024年02月16日
    浏览(38)
  • 在自定义数据集上微调Alpaca和LLaMA

    本文将介绍使用LoRa在本地机器上微调Alpaca和LLaMA,我们将介绍在特定数据集上对Alpaca LoRa进行微调的整个过程,本文将涵盖数据处理、模型训练和使用流行的自然语言处理库(如Transformers和hugs Face)进行评估。此外还将介绍如何使用grado应用程序部署和测试模型。 首先,alpaca-l

    2024年02月17日
    浏览(47)
  • 帝国CMS在自定义列表中获取当前列表ID的方法

    本文实例讲述了帝国CMS在自定义列表中获取当前列表ID的方法。分享给大家供大家参考,具体如下: 今天用帝国CMS做一个项目时,发现帝国自定义列表中无法获取当前自定义列表的ID。分析帝国源码后以现,帝国默认传出的值为0。下面简单记录一下如何通过修改源码实现“帝

    2023年04月20日
    浏览(84)
  • 在自定义数据集上训练 YOLOv8 进行目标检测

    这是目标检测中令人惊叹的 AI 模型之一。在这种情况下,您无需克隆存储库、设置要求并配置模型,就像在 YOLOv5 及其之前的版本中所做的那样。 在 YOLOv8 中,不需要执行这些手动任务。您只需安装 Ultralytics 即可,我将向您展示如何通过一个简单的命令安装它。 这是一个提

    2024年02月01日
    浏览(49)
  • 如何在自定义 Angular 指令中使用 @HostBinding 和 @HostListener

    简介 @HostBinding 和 @HostListener 是 Angular 中两个在自定义指令中非常有用的装饰器。 @HostBinding 允许你在承载指令的元素或组件上设置属性,而 @HostListener 则允许你监听宿主元素或组件上的事件。 在本文中,你将会在一个示例指令中使用 @HostBinding 和 @HostListener 来监听宿主上的

    2024年02月22日
    浏览(35)
  • 机器学习笔记 - 基于OpenMMLab在自定义数据集上训练RTMDet网络

            RTMDet是一种高效的实时目标检测器,其自报告指标优于YOLO 系列。它在COCO上实现了52.8% 的 AP ,在 NVIDIA 3090 GPU 上实现了300+ FPS,使其成为当前号称最快、最准确的目标检测器之一。 RTMDet   与其他实时物体检测器的对比。          RTMDet 采用了一种在主干和颈部

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包