elasticsearch:算法 function_score自定义相关度分数

通过Elasticsearch的function_score,可以结合field_value_factor与log1p函数,根据帖子的follower_num来增强搜索分数。当follower_num为0时,使用log1p避免分数变为0。通过factor调整影响程度,并用boost_mode选择分数计算方式(如multiply, sum等)。同时,max_boost限制了最高得分不超过设定值。" 131032964,11183300,Matlab GA优化SVM回归预测:多元数据建模,"['遗传算法', '优化支持向量机', 'GA-SVM回归预测', 'Matlab编程']

可以自定义一个function_score函数,自己将某个field的值,跟es内置算出来的分数进行运算,然后由自己指定的field来进行分数的增强

如网络中的帖子,查看的人越多,帖子的分数越高

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

1、如果只有field,那么会将每个doc的分数都乘以follower_num

  • 如果有的doc follower是0,那么分数就会变为0
  • 加个log1p函数(先加1再取log)【log函数
  • 如上所示:“fileld_value_factor”下,添加了log1p则field对应的follower_num需要 +1再取flag

2、再加factor,进一步影响分数,new_score = old_score * log(1 + factor * number_of_votes)
3、boost_mode,可以决定分数与指定字段的值如何计算,multiply,sum,min,max,replace,上面算出来的值和es算出来的分时是相乘、相加还是怎么着
4、max_boost,限制计算出来的分数不要超过max_boost指定的值

Elasticsearch 的得分算法主要依赖于 Lucene 的实现,其核心是基于 TF-IDF(Term Frequency-Inverse Document Frequency)模型[^4]。这种算法通过两个关键因素来衡量文档与查询的相关性: - **词频 (Term Frequency, TF)**:表示某个词在文档中出现的频率。如果一个词在文档中出现次数越多,则认为该词越相关。 - **逆文档频率 (Inverse Document Frequency, IDF)**:表示包含该词的文档数量在整个索引中的比例。如果一个词出现在较少的文档中,则认为这个词具有更高的区分度和重要性。 最终文档的 `_score` 评分就是由这些参数综合计算得出的结果,它反映了文档与搜索请求之间的匹配程度。 此外,Elasticsearch 提供了多种查询类型,每种查询子句会根据自身的逻辑生成相应的 `_score`。例如: - `fuzzy` 查询的 `_score` 反映的是原始搜索词与找到的关键词之间的拼写相似度。 - `terms` 查询的 `_score` 则体现为查询词在文档中所占的比例。 对于更复杂的场景,Elasticsearch 还支持自定义评分机制,可以通过 `function_score` 查询来应用额外的权重或函数对基础评分进行调整。这允许开发者针对特定业务需求优化搜索结果的相关性排序。 ### 示例代码 以下是一个简单的 Elasticsearch 查询示例,展示了如何使用 `match` 查询并查看返回结果中的 `_score` 字段: ```json { "query": { "match": { "content": "elasticsearch" } } } ``` 执行此查询后,Elasticsearch 返回的结果将包括每个匹配文档及其对应的 `_score` 值,如下所示: ```json { "hits": { "total": { "value": 3 }, "max_score": 0.9802, "hits": [ { "_index": "test-index", "_type": "_doc", "_id": "1", "_score": 0.9802, "_source": { "content": "Elasticsearch is a powerful search engine." } }, ... ] } } ``` 在这个例子中,`_score` 表示每个文档与查询词 "elasticsearch" 的相关性得分。 ### 高级特性 除了基本的 TF-IDF 模型外,Elasticsearch 还提供了其他高级功能来进一步影响评分过程,比如: - 使用 `boost` 参数给某些字段赋予更高的权重。 - 应用 `script_score` 函数以脚本方式动态修改评分。 - 结合机器学习模型来进行个性化排序。 这些工具使得 Elasticsearch 成为了处理复杂搜索需求的强大平台,并且能够灵活适应各种应用场景的需求。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值