前面我们已经讲过父子文档的作用以及创建步骤,不会的小伙伴可以参见之前的文章。本次我们直接切人主题,对父子文档进行排序介绍。
文档排序方式
1、根据父文档字段排序父文档 >> 简单
2、根据父文档字段排序子文档 >> 稍复杂 不能直接进行sort排序需要父文档评分影响子文档排序
3、根据子文档字段排序父文档 >> 稍复杂 不能直接进行sort排序需要子文档评分影响父文档排序
排序原理与方案
function_score 查询评分,我们根据评分对查询结果造成影响。
function_score 查询模板可以分为两类
1、单个加强函数的查询模板:
{
"query": {
"function_score": {
"query": {.....}, // 主查询,查询完后会有一个 _score 评分
"field_value_factor": {...}, // 在 _score 的基础上进行强化评分
"boost_mode": "multiply", // 指定用哪种方式结合 _score 和 强化 score
"max_boost": 1.5 // 限制强化 score 的最高分,但是不会限制 _score
}
}
}
{
"query": {
"function_score": {
"query": {.....}, // 主查询,查询完后会有一个 _score 评分
"random_score": {...}, // 在 _score 的基础上进行强化随机数评分
"boost_mode": "multiply", // 指定用哪种方式结合 _score 和 强化 score
"max_boost": 1.5 // 限制强化 score 的最高分,但是不会限制 _score
}
}
}
{
"query": {
"function_score": {
"query": {.....}, // 主查询,查询完后会有一个 _score 评分
"script_score": {...}, // 在 _score 的基础上进行强化自定义评分,比如某个字段
"boost_mode": "multiply", // 指定用哪种方式结合 _score 和 强化 score
"max_boost": 1.5 // 限制强化 score 的最高分,但是不会限制 _score
}
}
}
2、多个加强函数的查询模板:
{
"query": {
"function_score": {
"query": {.....},
"functions": [
// 可以有多个加强函数(或是 filter+加强函数),每一个加强函数会产生一个加强 score
{ "field_value_factor": ... },
{ "random_score": ... },
{ "script_score": ... },
{ "gauss": ... },
{ "filter": {...}, "weight": ... }
],
"score_mode": "sum", // 决定加强 score 们如何整合
"boost_mode": "multiply" // 决定最后的 functions 中 score 和 query score 的结合方式
}
}
3、函数参数解释
boost_mode 参数决定 query 中的相关性分数和加强的函数分数的结合方式。
multiply:默认的配置,两者分数相乘,new_score = _score * boost_score;
sum:两者相加,new_score = _score + boost_score;
min:取两者最小值,new_score = min(_score, boost_score);
max:取两者最大值,new_score = max(_score, boost_score);
replace:用 boost_score 替换 _score 值。
score_mode 参数决定 functions 里面的强化 score 如何结合,function_score 先会执行 score_mode 的设置,即先整合所有的强化计算,再执行 boost_mode 的配置,就是将 query 相关性分数和整合强化分数的结合。
multiply:默认的配置,多个强化分数相乘;
sum:多个强化分数相加;
min:取多个强化分数最小值;
max:取多个强化分数最大值;
avg:取多个强化分数平均值;
first:使用首个函数的结果作为最终结果。
max_boost:限制加强函数的最大效果,就是限制加强 score 最大能多少,但要注意不会限制 old_score。
如果加强 score 超过了 max_boost 限制的值,会把加强 score 的值设成 max_boost 的值;
假设加强 score 是5,而 max_boost 是2,因为加强 score 超出了 max_boost 的限制,所以 max_boost 就会把加强 score 改为2。简单的说,就是 final_score = min(整合后的 score, max_boost)。
小试牛刀
本次我们只模拟根据子文档字段对父文档进行排序,该类型在实际业务业务中经常出现。
1、实战题目:
父文档 clue_list
子文档 pool
根据子文档 pool 的poolCreateTime字段对父文档clue_list 数据排序
GET clue_list/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"joinFiled": {
"value": "clue_list"
}
}
},{
"has_child": {
"type": "pool",
"score_mode": "max",
"query": {
"function_score": {
"query": {
"bool": {
"must": [
{
"range": {
"poolCreateTime": {
"from":"2020-12-21T16:00:00.000Z",
"to":"2022-12-22T16:00:00.000Z"
}
}
}
]
}
},
"functions": [
{
"field_value_factor": {
"field": "poolCreateTime"
}
}
]
}
}
}
}
]
}
},
"sort": [
{
"_score": {
"order": "desc"
}
}
]
}
也可将functions中替换为:
{
"script_score": {
"script": "if(doc['poolCreateTime'].size() > 0){ return _score * doc['poolCreateTime'].value.toInstant().toEpochMilli();}"
}
}
field_value_factor 效率更高。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154661.html