elasticsearch(12)用function_score自定义相关度分数算法

本文介绍如何使用ElasticSearch的function_score函数自定义相关度分数算法,通过follower_num字段增强搜索结果的分数,实现帖子分数与关注者数量的正相关,提升热门帖子的搜索排名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自优快云本文链接地址: ElasticSearch用function_score自定义相关度分数算法

需求

  1. 在field: tile 和 content 中查找 java spark 的doc
  2. 要求follower_num越多的 doc 分数越高。(看帖子的人越多,那么帖子的分数就越高)

function_score函数:

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

例子

给所有的帖子数据增加follower数量

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": ["tile", "content"]
        }
      },
      "field_value_factor": {
        "field": "follower_num",
        "modifier": "log1p",
        "factor": 0.5
      },
      "boost_mode": "sum",
      "max_boost": 2
    }
  }
}
  • field_value_factor中如果只有field,那么会将每个doc的分数都乘以follower_num,如果有的doc follower是0,那么分数就会变为0,效果很不好。
  • 因此一般会加个log1p函数,公式会变为,new_score = old_score * log(1 + number_of_votes),这样出来的分数会比较合理
  • 再加个factor,可以进一步影响分数,new_score = old_score * log(1 + factor * number_of_votes)
  • boost_mode,可以决定分数与指定字段的值如何计算,multiply,sum,min,max,replace
  • max_boost,限制计算出来的分数不要超过max_boost指定的值
### 实现问答系统的工作流程 构建一个包含问题解析、检索节点、评分节点、决策点以及查询重写的问答系统,涉及多个关键技术环节。以下是具体的技术实现细节: #### 1. **输入查询处理** 当用户提交一个问题时,系统会对其进行初步解析和分词处理。这一阶段的目标是理解用户的查询意图并将其转化为可操作的形式。如果查询可以直接匹配到基础数据库中的答案,则进入基础检索;否则,可能需要进一步的图扩展检索来完成多跳推理[^1]。 ```python def preprocess_query(query): """ 对用户提问进行预处理,包括分词、去除停用词等。 """ tokens = query.split() # 简单模拟分词过程 processed_tokens = [token.lower() for token in tokens if not is_stopword(token)] return processed_tokens ``` #### 2. **初始检索** 初始检索分为两部分: - 如果存在直接对应的答案,则返回结果(基础检索)。 - 若无直接答案,则启动更复杂的图扩展检索逻辑,尝试通过关联关系找到潜在解答。 在此基础上还可以加入知识同步模块,用于实时更新背景知识库的内容,确保信息的新鲜度。 #### 3. **迭代优化与记忆机制** 为了提高效率,引入波束搜索算法筛选最有可能的答案路径,并结合记忆机制存储中间状态以减少不必要的重复计算。此外,还应考虑递归式推理的应用——即利用先前步骤的结果指导后续推导过程,降低整体运算成本[^4]。 ```python class BeamSearchOptimizer: def __init__(self, beam_width=5): self.beam_width = beam_width def optimize(self, candidates): top_candidates = sorted(candidates, key=lambda x: score_function(x), reverse=True)[:self.beam_width] return top_candidates ``` #### 4. **评分节点设计** 采用多路召回策略收集来自不同模型的候选答案集合,随后运用统一评估标准衡量各选项的质量得分。最终选取分数最高的作为推荐回复[^2]。 #### 5. **决策树结构应用** 整个流程按照预先定义好的决策树展开执行。例如,在某些情况下仅需调用简单的关键词匹配即可满足需求;而对于较为复杂的情境则要启用深层次的语义分析工具。 #### 6. **查询重写功能** 针对模糊或者表述不清的问题,实施自动化的查询改写技术有助于改善检索效果。此操作通常发生在无法有效定位目标资源之后,目的是生成更加精确的新版本请求串以便再次尝试获取理想成果。 --- ### 数据管理方案探讨 考虑到实际开发环境下的数据一致性维护难题,可以借鉴Spring Boot框架配合Elasticsearch搭建全文搜索引擎的经验做法。尽管使用AOP(面向切面编程)简化了事务管理和日志记录等工作量,但也带来了较高的组件间依赖程度风险,因此建议权衡利弊后再做决定[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值