首先,solr使用的是默认的评分机制,要搞明白lucene默认评分机制,需要首先了解一下lucene的查询对象。
1、termquery
2、boolean query
3、rangequery
其中最重要的是termquery。是lucene的最基本的原子查询。每个查询最后内部都转化为一个个的原子查询。
example:
TermQuery term = new TermQuery("text", "test");
TermQuery term = new TermQuery("title", "test");
记住,term query是针对指定域进行查询的。记住这一点有利于理解lengthNorm()
另外,需要明确一点,lucene会先用bool模型来拿到所有符合条件的document,再将q转化为多个should拼接的termquery去和符合条件的doc进行相似度计算。
lucene的打分公式如下:
score(q,d) = queryNorm(q) · coord(q,d) · ∑ ( tf(t in d) · idf(t)² · t.getBoost() · norm(t,d) ) (t in q)
其中最后一部分求和解释一下:(是对每个termquery,计算其得分最后累加)
tf:对指定域的temquery,在dcoument中出现的次数。
idf:是term在所有文档出现的次数
t.getboost():对每个termquery都可以赋予一个boost
norm:d.getboost()*f.getboost()*lengthNorm(f)其中f是term指定的域
下面是简单获取score。注:条件q千万不要带默认的条件*:*,如果是*:*那么相当于条件都一样,score全为1.0。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2017-11-24 .NET自带IOC容器MEF之初体验(转)
2010-11-24 C#3.5自动属性(小技巧)
2009-11-24 分享开发soket经验 我的基于socket的持久层(转)
2009-11-24 各种CMS
2009-11-24 权限小结
2006-11-24 在js中刷新本页
2006-11-24 FormsAuthentication的理解和使用