你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
发现
分享
文章
活动
登录
即使是不成熟的尝试,也胜于胎死腹中的策略。
Lucene里的王安德打分器
Lucene
| 作者
Charele
| 发布于2024年04月13日 | 阅读数:
5079
分享到:
QQ空间
新浪微博
微信
QQ好友
印象笔记
有道云笔记
WAND即 : Weak AND,
WAND打分器,用在boolean查询的should类型中,
比如我要找"000" or "111" or "222" or "333" ,,, or "999, 这10个词中,必须最小满其中的8个。
https://amazingkoala.com.cn/Lu ... 2589/
这里有介绍,但他只介绍了基本思想,
并没有明细的表述,可能是忘了写第二章了吧
没有找到相关结果
已邀请:
与内容相关的链接
提交
5 个回复
Charele
-
Cisco4321
赞同来自:
Wand的结构和执行过于复杂,能不用尽量不用,
PS: bool查询由于选项较多(must等4种条件, 加上minShouldMatch),
所以为了生成布尔查询的打分器,
分叉特别多,而每一个分支会产生一个主题,
所以想对布尔查询有一个清西的理解,可以说非常之困难。
现在只谈一下,这棵大树的其中一个分支: Wand打分器
Charele
-
Cisco4321
赞同来自:
同一个类,不同版本的Lucene之间会有差异,
变化的结果肯定是,新版的越来越复杂:-(
上面是大神博客里的,他那个版本可能比较老
下面是最新版的
Charele
-
Cisco4321
赞同来自:
文章里有一个可以简化的公式,意思是说,
比如我有10个should条件,必须满足其中的8个,
现在我只要看看10 - 8 + 1 = 3个打分器就可以了。理论上是这样,
但现在版本中,并没有这么做,它还是得满足8个。
可能是版本实现不同(理不清的东东,不想去看老版本了),
也可能是我没理解出这个思想体现在哪,有理解的人可以告知一下
这个理论只体现在算cost的时候,仅仅用在这儿而已!
这个代码的意思是,如果10个should子条件,必须满足其中的8个,
(子条件也是查询,也有它自己的打分器)
我把代码最小的3个子条件的代价相加,
作为这个Wand打分器的代价。
这个代价对Wand自身并没有作用,
但如果Wand查询是另外一个查询的子查询(即Wand打分器是子打分器),就有用了
Charele
-
Cisco4321
赞同来自:
:10个should子条件,必须满足其中的8个(忽略打分)
DisiWrapper类用来包装子打分器,
比如你子查询是"TermQuery",那子打分器就是"TermScorer"类型
这里面有3个容器变量,
具体的执行过程,就是把10个子打分器在这3个容器里倒来倒去,,,变量1不是容器类型。但DisiWrapper类里有个next变量,指向下一个DisiWrapper对像。形成一个链表
2 数组
3 优先级队列
Charele
-
Cisco4321
赞同来自:
它之所以搞得这么复杂,是有原因的,
1 要算打分, 2 是要考虑子条件(子查询)的代价。
设想一下,有3个queue,你要求出所有数字,最少在两个数组中有
A: 0, 1, 4, 5, 10 代价:10
B: 0, 2, 7, 8, 11, 15 代价:30
C: 0, 4 5, 6, 11, 100 代价:20
PS: 一个queue,等于Wand打分器中的一个should条件(子打分器),
数字就等于这个子打分器取出来的文档号
你很容易就可以看出(程序也很容易实现),0, 4, 5,11满足。
所以,文档0,4,5,11就是满足你这个布尔查询的结果
实际中,它会考虑各个子打分器的代价,会先从代价小的子打分器中取文档号。
比如上面,按须序取的话,取完a和b里的0,就知道0是满足了minShould
就不用从c中去取了。
但队列b的代价是最大的,所以它不会从b中去取,会先从a,c中取
要回复问题请先
登录
或
注册
发起人
Charele
Cisco4321
活动推荐
Aug
15
2025 Zabbix 中国峰会
上海
·
8-15 周五
·
报名中
Oct
17
第27届 GOPS 全球运维大会暨研运数智化技术峰会 · 上海站
上海
·
10-17 周五
·
报名中
相关问题
elasticsearch打分优化
请教各位,为什么要足够大的内存给Lucene?为什么用SSD可以提高性能
Java REST Client 怎么把Lucene的原生query传给ES
ES匹配度的打分问题
ES所在主机内存耗尽问题,有没有相关参数限制lucene使用操作系统剩下的内存?
lucene倒排索引关于数据压缩的问题
谁推荐一本关于es以及lucene的书籍,深入学习es
全文检索场景,ES7打分耗时比ES5打分耗时长
ES查询时对Lucene的优化
es里的document的"_id"和org.apache.lucene.search.ScoreDoc.doc是什么关系
修改Lucene源码
问题状态
最新活动:
2024-05-12 11:42
浏览:
5079
关注:
1
人
5 个回复
Charele - Cisco4321
赞同来自:
Wand的结构和执行过于复杂,能不用尽量不用,
PS: bool查询由于选项较多(must等4种条件, 加上minShouldMatch),
所以为了生成布尔查询的打分器,
分叉特别多,而每一个分支会产生一个主题,
所以想对布尔查询有一个清西的理解,可以说非常之困难。
现在只谈一下,这棵大树的其中一个分支: Wand打分器
Charele - Cisco4321
赞同来自:
同一个类,不同版本的Lucene之间会有差异,
变化的结果肯定是,新版的越来越复杂:-(
上面是大神博客里的,他那个版本可能比较老
下面是最新版的
Charele - Cisco4321
赞同来自:
文章里有一个可以简化的公式,意思是说,
比如我有10个should条件,必须满足其中的8个,
现在我只要看看10 - 8 + 1 = 3个打分器就可以了。理论上是这样,
但现在版本中,并没有这么做,它还是得满足8个。
可能是版本实现不同(理不清的东东,不想去看老版本了),
也可能是我没理解出这个思想体现在哪,有理解的人可以告知一下
这个理论只体现在算cost的时候,仅仅用在这儿而已!
这个代码的意思是,如果10个should子条件,必须满足其中的8个,
(子条件也是查询,也有它自己的打分器)
我把代码最小的3个子条件的代价相加,
作为这个Wand打分器的代价。
这个代价对Wand自身并没有作用,
但如果Wand查询是另外一个查询的子查询(即Wand打分器是子打分器),就有用了
Charele - Cisco4321
赞同来自:
DisiWrapper类用来包装子打分器,
比如你子查询是"TermQuery",那子打分器就是"TermScorer"类型
这里面有3个容器变量,
具体的执行过程,就是把10个子打分器在这3个容器里倒来倒去,,,变量1不是容器类型。但DisiWrapper类里有个next变量,指向下一个DisiWrapper对像。形成一个链表
2 数组
3 优先级队列
Charele - Cisco4321
赞同来自:
1 要算打分, 2 是要考虑子条件(子查询)的代价。
设想一下,有3个queue,你要求出所有数字,最少在两个数组中有
A: 0, 1, 4, 5, 10 代价:10
B: 0, 2, 7, 8, 11, 15 代价:30
C: 0, 4 5, 6, 11, 100 代价:20
PS: 一个queue,等于Wand打分器中的一个should条件(子打分器),
数字就等于这个子打分器取出来的文档号
你很容易就可以看出(程序也很容易实现),0, 4, 5,11满足。
所以,文档0,4,5,11就是满足你这个布尔查询的结果
实际中,它会考虑各个子打分器的代价,会先从代价小的子打分器中取文档号。
比如上面,按须序取的话,取完a和b里的0,就知道0是满足了minShould
就不用从c中去取了。
但队列b的代价是最大的,所以它不会从b中去取,会先从a,c中取